From 70afba8c3d22bb76459a9b395eb74315999f355f Mon Sep 17 00:00:00 2001 From: Hugh A Miles II Date: Thu, 29 Oct 2026 02:13:43 -0400 Subject: [PATCH 01/11] fix(partition-mapping): stop bare unix_timestamp dropping rows on bucketed epoch keys Hive/Impala suggested `unix_timestamp(:value)` as the partition transform. On hour- or day-bucketed epoch keys it yields the raw instant rather than the bucket boundary, so mirrored predicates silently excluded matching rows. - Remove the Hive/Impala default; decline mirroring for the bare expression on temporal-to-numeric mappings and surface the refusal in the editor. - Add an explicit "Validate against data" check that compares the transform of sampled business values with the same rows' stored partition keys. - Label expression-only preview as evaluated, not verified. - Document bucket, timezone and validation semantics. Co-Authored-By: Claude Opus 5.5 --- UPDATING.md | 2 + .../partition-filter-mapping.mdx | 62 +++- .../PartitionColumnFields.tsx | 26 +- .../PartitionDataValidation.test.tsx | 154 ++++++++ .../PartitionDataValidation.tsx | 164 +++++++++ .../PartitionFilterMapping.test.tsx | 59 +++ .../PartitionMappingSection.tsx | 19 +- .../PartitionFilterMapping/types.ts | 25 ++ superset/connectors/sqla/models.py | 8 +- superset/connectors/sqla/partition_mapping.py | 97 ++++- .../connectors/sqla/partition_validation.py | 198 ++++++++++ superset/datasets/api.py | 70 +++- superset/datasets/schemas.py | 13 +- superset/db_engine_specs/hive.py | 5 +- superset/db_engine_specs/impala.py | 5 +- .../sqla/partition_validation_test.py | 338 ++++++++++++++++++ .../partition_mapping_preview_test.py | 5 + .../partition_mapping_serialization_test.py | 2 + tests/unit_tests/db_engine_specs/test_hive.py | 6 +- .../unit_tests/db_engine_specs/test_impala.py | 6 +- .../models/partition_mirroring_test.py | 79 ++++ 21 files changed, 1294 insertions(+), 49 deletions(-) create mode 100644 superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.test.tsx create mode 100644 superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.tsx create mode 100644 superset/connectors/sqla/partition_validation.py create mode 100644 tests/unit_tests/connectors/sqla/partition_validation_test.py diff --git a/UPDATING.md b/UPDATING.md index fdbfd8821497..9d17d4e75705 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -24,6 +24,8 @@ assists people when migrating to a new version. ## Next +- Partition filter mapping no longer suggests bare `unix_timestamp(:value)` on Hive/Impala-family engines. Existing temporal-to-numeric mappings using that expression stop pruning to prevent incorrect counts on hour/day epoch keys. Replace it with the expression that populates the partition key, including rounding and timezone. The dataset editor can explicitly compare a candidate against sampled rows from selected numeric partitions; a sample match is not a guarantee for the entire dataset. + - Refreshing a dataset's columns from its source (the "Sync columns from source" button, `PUT /api/v1/dataset/?override_columns=true`, or `PUT /api/v1/dataset//refresh`) no longer resets **Is dimension** and diff --git a/docs/admin_docs/configuration/partition-filter-mapping.mdx b/docs/admin_docs/configuration/partition-filter-mapping.mdx index 1190a7e4d43e..62390ae4ad52 100644 --- a/docs/admin_docs/configuration/partition-filter-mapping.mdx +++ b/docs/admin_docs/configuration/partition-filter-mapping.mdx @@ -66,13 +66,57 @@ Expand the mapped column's row in *Column Settings* and set the **value transfor expression containing a `:value` placeholder, which stands for the filter value being mirrored. The **Transform preserves ordering** checkbox sits directly beneath it. -| Mapped column | Partition column | Transform | -|---|---|---| -| `event_time` (`TIMESTAMP`) | `dt_epoch` (`BIGINT`) | `unix_timestamp(:value)` | -| `country` (`VARCHAR`) | `region_key` (`VARCHAR`) | `lower(:value)` | +No engine default can infer how your pipeline buckets a numeric partition key. +Enter the expression that actually populates it, including units and timezone. -A filter of `event_time >= '2026-01-01'` then adds `dt_epoch >= 1767225600` to the query. -The added predicate is an ordinary `WHERE` clause and shows up in **View query**. +| Mapped column | Stored partition key | Transform | +|---|---|---| +| Epoch seconds (`BIGINT`, datetime format `epoch_s`) | Hour-start epoch seconds | `CAST(floor(:value / 3600) * 3600 AS BIGINT)` | +| Epoch seconds (`BIGINT`, datetime format `epoch_s`) | UTC day-start epoch seconds | `CAST(floor(:value / 86400) * 86400 AS BIGINT)` | +| UTC `TIMESTAMP`, with UTC epoch conversion in the database session | Hour-start epoch seconds | `CAST(floor(unix_timestamp(:value) / 3600) * 3600 AS BIGINT)` | +| UTC `TIMESTAMP`, with UTC epoch conversion in the database session | UTC day-start epoch seconds | `CAST(floor(unix_timestamp(:value) / 86400) * 86400 AS BIGINT)` | +| `country` (`VARCHAR`) | Lowercase `region_key` | `lower(:value)` | + +The timestamp examples use Hive/Impala syntax. Confirm conversion settings in both +query and transform-evaluation sessions; `unix_timestamp` can depend on session timezone. +The numeric epoch examples avoid that conversion. Use mathematical floor, including for +negative epochs. Millisecond inputs require conversion to seconds before these expressions; +local-calendar-day keys are not interchangeable with fixed UTC 86,400-second buckets. + +Bare `unix_timestamp(:value)` is not suggested or mirrored for temporal-to-numeric +mappings on Hive/Impala and their engine-spec subclasses. It produces an instant, +not an hour/day boundary, and can silently exclude matching rows. Existing expressions +remain editable; replace them with the pipeline's actual partition expression. + +Dataset time-range bounds already pass through Superset's timezone/hour-offset adjustment +before mirroring. Do not convert those bounds from the dataset timezone a second time. +The added partition predicate remains visible in **View query**. + +### Validate against stored data + +The automatic preview reports **Expression evaluated — data not checked**. This means +Superset could evaluate the expression and build a predicate, not that it matches your data. + +For a physical dataset with a numeric epoch key, enter one to three **existing partition +keys**, then choose **Validate against data**. Superset reads at most 50 rows from each +selected partition and compares each transformed business value with that same row's +stored key. It applies your data-access permissions and row-level security. It does not +run a total-count query or infer sample partitions from the candidate expression. + +- **Matched sampled rows** reports the checked rows and covered partitions. This is + evidence about that sample, not proof for all rows, backfills, or future ingestion. +- **Partition mismatch found** shows the business value, stored key, and transform output. + An output found in another partition still fails the same-row comparison. +- **Validation inconclusive** means a selected partition had no checkable rows or an + evaluation/query failed. NULL business values cannot establish a match. + +Choose partitions containing off-boundary business timestamps, such as 10:47:23, and repeat +across relevant dates and timezone transitions. The read is restricted to the selected keys; +a row limit does not guarantee a cheap scan within a large partition. Existing warehouse +query limits still apply. Changing the candidate clears the displayed validation. +Validation does not save a global verdict, change chart behavior, or override the bare-epoch +safety refusal. Before enabling a production mapping, compare chart row IDs and counts with +and without its partition predicates, including equality, IN, and partial-bucket ranges. ### Transform preserves ordering @@ -89,7 +133,7 @@ declare it rather than guessing. A *bucketing* transform preserves ordering and is the common case rather than an exception: `to_char(:value, 'YYYYMMDD')`, `date(:value)` and -`cast(unix_timestamp(:value) / 86400 as bigint)` each map a whole day onto one +`CAST(floor(unix_timestamp(:value) / 86400) * 86400 AS BIGINT)` each map a whole day onto one partition key, which is exactly what a daily-partitioned table wants. Check the box for these. @@ -239,7 +283,7 @@ column. That substitution is only valid if, for every row in the table: partition_column = (mapped_column) ``` -**Superset cannot verify this.** It is a property of whatever ETL populates the partition +**Sample validation cannot prove this for the entire dataset.** It is a property of whatever ETL populates the partition column. If that job lags, backfills with different logic, or writes the partition key in a different timezone than the transform resolves, mirrored predicates silently drop real rows and charts show quietly wrong numbers. Confirm the invariant with whoever owns the pipeline @@ -285,7 +329,7 @@ value it got, and the fix is to cast the result to the key's own type — Because the evaluation happens in a **different session** from the chart query, transforms that call non-deterministic functions are rejected when you save. That includes `now()`, `current_date`, `current_timestamp`, `rand()` and the zero-argument `unix_timestamp()`, which -means "now" on Hive and Impala. The one-argument `unix_timestamp(:value)` is fine. +means "now" on Hive and Impala. The one-argument function is deterministic only under consistent session settings; the bare expression is declined for temporal-to-numeric Hive/Impala-family mappings because it does not specify a bucket. Session-dependent behaviour that Superset cannot detect is still your responsibility: `unix_timestamp(:value)` is timezone-dependent on Hive and Impala, so if the evaluating diff --git a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionColumnFields.tsx b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionColumnFields.tsx index 0ca01471050d..8d55f67f1d82 100644 --- a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionColumnFields.tsx +++ b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionColumnFields.tsx @@ -133,7 +133,13 @@ export default function PartitionColumnFields({ // mapped column's row already asks it. Deferring to that answer where there // is one is what keeps this banner and that panel from contradicting each // other. + const refusal = datasource.partition_filter_mapping?.safety_refusal; + const refusalApplies = + refusal?.mapped_column === mappedColumn && + refusal?.partition_column === datasource.partition_column && + refusal?.value_transform === liveTransform; const isActive = + !refusalApplies && mappingIsActive(datasource, allColumns) && previewMirrors !== false && !( @@ -306,15 +312,17 @@ export default function PartitionColumnFields({ type="warning" showIcon message={ - liveTransform - ? t( - 'The value transform on %(mapped)s is not mirroring filters, so queries will scan every partition.', - { mapped: mappedColumn }, - ) - : t( - 'No value transform is set on %(mapped)s, so nothing is mirrored yet and queries will scan every partition.', - { mapped: mappedColumn }, - ) + refusalApplies + ? refusal?.message + : liveTransform + ? t( + 'The value transform on %(mapped)s is not mirroring filters, so queries will scan every partition.', + { mapped: mappedColumn }, + ) + : t( + 'No value transform is set on %(mapped)s, so nothing is mirrored yet and queries will scan every partition.', + { mapped: mappedColumn }, + ) } /> )} diff --git a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.test.tsx b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.test.tsx new file mode 100644 index 000000000000..8d1aa58144de --- /dev/null +++ b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.test.tsx @@ -0,0 +1,154 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import fetchMock from 'fetch-mock'; +import { + fireEvent, + render, + screen, + userEvent, + waitFor, +} from 'spec/helpers/testing-library'; +import PartitionDataValidation from './PartitionDataValidation'; + +const endpoint = 'glob:*/api/v1/dataset/1/partition_mapping/preview/'; +const props = { + datasetId: 1, + mappedColumn: 'event_time', + partitionColumn: 'dt_epoch', + valueTransform: 'unix_timestamp(:value)', + isMonotonic: true, + sampleValues: ['2026-01-15 10:47:23'], + operator: '>=', + disabled: false, +}; +afterEach(() => fetchMock.clearHistory().removeRoutes()); + +test('validation is explicit and preserves integer keys as strings', async () => { + fetchMock.post(endpoint, { + result: { + valid: false, + data_validation: { + status: 'mismatch', + checked_rows: 1, + partitions_checked: 1, + examples: [ + { + source_value: '2026-01-15 10:47:23', + stored_key: '1768471200', + transformed_value: '1768474043', + }, + ], + }, + }, + }); + render(); + fireEvent.change(screen.getByRole('textbox'), { + target: { value: '9007199254740993' }, + }); + expect(fetchMock.callHistory.called(endpoint)).toBe(false); + await userEvent.click( + screen.getByRole('button', { name: 'Validate against data' }), + ); + expect( + await screen.findByText('Partition mismatch found'), + ).toBeInTheDocument(); + expect( + screen.getByText(/stored key: 1768471200; transform: 1768474043/), + ).toBeInTheDocument(); + const call = fetchMock.callHistory.lastCall(endpoint); + expect( + JSON.parse(call?.options.body as string).validation_partition_values, + ).toEqual(['9007199254740993']); +}); + +test('changing a candidate clears sampled success', async () => { + fetchMock.post(endpoint, { + result: { + valid: true, + data_validation: { + status: 'matched', + checked_rows: 50, + partitions_checked: 1, + }, + }, + }); + const { rerender } = render(); + fireEvent.change(screen.getByRole('textbox'), { + target: { value: '1768471200' }, + }); + await userEvent.click( + screen.getByRole('button', { name: 'Validate against data' }), + ); + expect( + await screen.findByText('Matched 50 sampled rows across 1 partitions'), + ).toBeInTheDocument(); + rerender( + , + ); + expect(screen.queryByText(/Matched 50/)).not.toBeInTheDocument(); +}); + +test('late validation cannot describe a changed candidate', async () => { + let resolveResponse: (value: object) => void = () => {}; + fetchMock.post( + endpoint, + () => + new Promise(resolve => { + resolveResponse = resolve; + }), + ); + const { rerender } = render(); + fireEvent.change(screen.getByRole('textbox'), { + target: { value: '1768471200' }, + }); + await userEvent.click( + screen.getByRole('button', { name: 'Validate against data' }), + ); + rerender(); + resolveResponse({ + result: { + valid: true, + data_validation: { + status: 'matched', + checked_rows: 1, + partitions_checked: 1, + }, + }, + }); + await waitFor(() => + expect( + screen.getByRole('button', { name: 'Validate against data' }), + ).toBeEnabled(), + ); + expect(screen.queryByText(/Matched 1/)).not.toBeInTheDocument(); +}); + +test('empty, invalid, and excessive partition selections cannot run', () => { + render(); + for (const value of ['', 'abc', '1,2,3,4']) { + fireEvent.change(screen.getByRole('textbox'), { target: { value } }); + expect( + screen.getByRole('button', { name: 'Validate against data' }), + ).toBeDisabled(); + } +}); diff --git a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.tsx b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.tsx new file mode 100644 index 000000000000..703e7a864cc2 --- /dev/null +++ b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.tsx @@ -0,0 +1,164 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { useEffect, useRef, useState } from 'react'; +import { SupersetClient, getClientErrorObject } from '@superset-ui/core'; +import { t } from '@apache-superset/core/translation'; +import { Alert } from '@apache-superset/core/components'; +import { Button, Flex, Input, Typography } from '@superset-ui/core/components'; +import type { + PartitionDataValidationResult, + PartitionMappingPreview, +} from './types'; + +interface Props { + datasetId?: number; + mappedColumn: string; + partitionColumn: string; + valueTransform: string; + isMonotonic: boolean; + sampleValues: string[]; + operator: string; + disabled: boolean; +} + +/** Explicitly check actual row pairs; never scan a table while typing a transform. */ +export default function PartitionDataValidation(props: Props) { + const [keys, setKeys] = useState(''); + const [result, setResult] = useState(); + const [loading, setLoading] = useState(false); + const requestId = useRef(0); + const identity = JSON.stringify([props, keys]); + const identityRef = useRef(identity); + identityRef.current = identity; + const [resultIdentity, setResultIdentity] = useState(''); + useEffect(() => { + requestId.current += 1; + setLoading(false); + setResult(undefined); + return () => { + requestId.current += 1; + }; + }, [identity]); + const values = keys.split(',').map(key => key.trim()); + const keysValid = + values.length <= 3 && values.every(key => /^-?[0-9]{1,20}$/.test(key)); + + const validate = async () => { + requestId.current += 1; + const currentRequest = requestId.current; + const submittedIdentity = identity; + setLoading(true); + setResult(undefined); + const current = () => + currentRequest === requestId.current && + submittedIdentity === identityRef.current; + try { + const { json } = await SupersetClient.post({ + endpoint: `/api/v1/dataset/${props.datasetId}/partition_mapping/preview/`, + jsonPayload: { + mapped_column: props.mappedColumn, + partition_column: props.partitionColumn, + value_transform: props.valueTransform, + is_monotonic: props.isMonotonic, + sample_values: props.sampleValues, + operator: props.operator, + validation_partition_values: values, + }, + }); + if (current()) { + setResult((json.result as PartitionMappingPreview).data_validation); + setResultIdentity(submittedIdentity); + } + } catch (error) { + const clientError = await getClientErrorObject(error); + if (current()) { + setResult({ + status: 'inconclusive', + message: clientError.error || t('Data validation failed.'), + }); + setResultIdentity(submittedIdentity); + } + } finally { + if (current()) setLoading(false); + } + }; + const visible = resultIdentity === identity ? result : undefined; + return ( + + + {t('Existing partition keys (up to three, comma separated)')} + + setKeys(event.target.value)} + placeholder={t('Enter stored epoch partition keys, not timestamps')} + /> + + {t( + 'Checks up to 50 rows per selected partition. Sampling cannot verify every row or future ingestion.', + )} + + + {visible && ( + + {visible.message} + {visible.examples?.map((example, index) => ( + + {t( + 'Source: %(source)s; stored key: %(stored)s; transform: %(actual)s', + { + source: example.source_value, + stored: example.stored_key, + actual: example.transformed_value ?? 'NULL', + }, + )} + + ))} + + } + /> + )} + + ); +} diff --git a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionFilterMapping.test.tsx b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionFilterMapping.test.tsx index 18735c4308f3..ca4726223810 100644 --- a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionFilterMapping.test.tsx +++ b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionFilterMapping.test.tsx @@ -1455,3 +1455,62 @@ test('the unsaved notice is not reported as a failed verdict', async () => { ).toBeInTheDocument(); expect(onPreviewVerdict).not.toHaveBeenCalledWith(false); }); + +test('saved safety refusal is shown before expanding or previewing the mapped row', () => { + const datasource = { + main_dttm_col: 'event_time', + partition_column: 'dt_epoch', + partition_filter_mapping: { + safety_refusal: { + reason: 'unbucketed_epoch' as const, + mapped_column: 'event_time', + partition_column: 'dt_epoch', + value_transform: 'unix_timestamp(:value)', + message: 'Raw epoch conversion does not specify the partition bucket.', + }, + }, + }; + const common = { + columns: MAPPED_COLUMNS, + onPartitionColumnChange: jest.fn(), + onNavigateToColumn: jest.fn(), + }; + const { rerender } = render( + , + ); + expect( + screen.getByText( + 'Raw epoch conversion does not specify the partition bucket.', + ), + ).toBeInTheDocument(); + expect( + screen.queryByText(/will automatically apply/), + ).not.toBeInTheDocument(); + expect(fetchMock.callHistory.called()).toBe(false); + const corrected = MAPPED_COLUMNS.map(column => + column.column_name === 'event_time' + ? { + ...column, + partition_value_transform: 'floor(unix_timestamp(:value)/3600)*3600', + } + : column, + ); + rerender( + , + ); + expect( + screen.queryByText( + 'Raw epoch conversion does not specify the partition bucket.', + ), + ).not.toBeInTheDocument(); + expect(screen.getByText(/will automatically apply/)).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionMappingSection.tsx b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionMappingSection.tsx index c44b8c2887b2..8f6784e05f53 100644 --- a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionMappingSection.tsx +++ b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionMappingSection.tsx @@ -30,6 +30,7 @@ import { Loading, Typography, } from '@superset-ui/core/components'; +import PartitionDataValidation from './PartitionDataValidation'; import { useDebouncedCommit } from './useDebouncedCommit'; import { usePartitionMappingPreview } from './usePartitionMappingPreview'; import { @@ -332,7 +333,9 @@ export default function PartitionMappingSection({ iconColor={theme.colorSuccess} iconSize="s" /> - {t('Valid')} + + {t('Expression evaluated — data not checked')} + @@ -350,6 +353,20 @@ export default function PartitionMappingSection({ )} + 0 || + preview?.reason === 'unsaved' + } + /> {/* Only one of preview and error is ever visible. */} {!loading && preview && !preview.valid && ( /partition_mapping/preview/`. */ export interface PartitionMappingPreview { + /** Expression/predicate evaluation succeeded; not proof of partition correctness. */ valid: boolean; + data_validation?: PartitionDataValidationResult; sample_input?: string; emitted_predicate?: string; error?: string; /** Why it is invalid, so the panel can headline it correctly. */ reason?: + | 'unbucketed_epoch' | 'parse' | 'validation' | 'operator' @@ -113,3 +123,18 @@ export interface PartitionMappingIssue { */ blocking?: boolean; } + +export interface PartitionDataValidationResult { + status: 'not_checked' | 'matched' | 'mismatch' | 'inconclusive'; + checked_rows?: number; + skipped_rows?: number; + mismatch_count?: number; + partitions_checked?: number; + partitions_requested?: number; + message?: string; + examples?: { + source_value: string; + stored_key: string; + transformed_value: string | null; + }[]; +} diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 51dd4dd75ac5..64c3bc6273c4 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -74,6 +74,7 @@ from superset.common.db_query_status import QueryStatus from superset.connectors.sqla.partition_mapping import ( declares_array_type, + epoch_mapping_refusal, equality_mirrors_safely, FEATURE_FLAG as PARTITION_FILTER_MAPPING_FLAG, has_active_advanced_data_type, @@ -2312,8 +2313,12 @@ def partition_filter_mapping_summary(self) -> dict[str, Any] | None: mapped_column_name = self.partition_mapped_column or self.main_dttm_col mapped_column = columns_by_name.get(mapped_column_name or "") transform = mapped_column.partition_value_transform if mapped_column else None + safety_refusal = epoch_mapping_refusal( + self, mapped_column_name, self.partition_column, transform + ) active = bool( - self.partition_column in columns_by_name + not safety_refusal + and self.partition_column in columns_by_name and not declares_array_type(columns_by_name[self.partition_column].type) and mapped_column is not None and mapped_column_name != self.partition_column @@ -2327,6 +2332,7 @@ def partition_filter_mapping_summary(self) -> dict[str, Any] | None: "partition_column": self.partition_column, "mapped_column": mapped_column_name, "active": active, + "safety_refusal": safety_refusal, # Whether the last probe of this transform produced a mirror. # `active` is the save path's own verdict and deliberately stays # that -- a parse, which a misspelled function clears happily -- so diff --git a/superset/connectors/sqla/partition_mapping.py b/superset/connectors/sqla/partition_mapping.py index 5f51415b694e..104641045c20 100644 --- a/superset/connectors/sqla/partition_mapping.py +++ b/superset/connectors/sqla/partition_mapping.py @@ -191,6 +191,7 @@ import numpy as np import pandas as pd import sqlalchemy as sa +import sqlglot from dateutil.relativedelta import relativedelta from flask import current_app as app from flask_babel import lazy_gettext as _ @@ -1121,6 +1122,50 @@ def _find_niladic_calls(statement: SQLStatement) -> set[str]: return NON_DETERMINISTIC_WHEN_NILADIC & statement.get_niladic_functions() +def epoch_mapping_refusal( + datasource: SqlaTable, + mapped_column: str | None, + partition_column: str | None, + transform: str | None, +) -> dict[str, str] | None: + """Decline the former epoch default, whose bucket size is unspecified.""" + from superset.db_engine_specs.hive import HiveEngineSpec + from superset.db_engine_specs.impala import ImpalaEngineSpec + + columns = {col.column_name: col for col in datasource.columns} + source = columns.get(mapped_column) + target = columns.get(partition_column) + if ( + not transform + or source is None + or target is None + or not issubclass(datasource.db_engine_spec, (HiveEngineSpec, ImpalaEngineSpec)) + or _native_generic_type(source) != utils.GenericDataType.TEMPORAL + or _native_generic_type(target) != utils.GenericDataType.NUMERIC + ): + return None + try: + expression = sqlglot.parse_one(parse_skeleton(transform), read="hive").unnest() + former_default = sqlglot.parse_one("unix_timestamp(NULL)", read="hive") + if expression != former_default: + return None + except sqlglot.errors.ParseError: + return None + return { + "reason": "unbucketed_epoch", + "mapped_column": str(mapped_column), + "partition_column": str(partition_column), + "value_transform": transform, + "message": str( + _( + "Raw epoch conversion does not specify the partition bucket. " + "Use the expression that populates the partition key, including " + "its hour or day rounding and timezone. Filters will not be mirrored." + ) + ), + } + + def resolve_partition_mapping(datasource: SqlaTable) -> PartitionMapping | None: """ Resolve the dataset's mapping, or ``None`` when nothing may be mirrored. @@ -1179,6 +1224,11 @@ def resolve_partition_mapping(datasource: SqlaTable) -> PartitionMapping | None: # about does not exist and mirroring would apply the wrong values. return None + if epoch_mapping_refusal( + datasource, mapped_column_name, partition_column, transform + ): + return None + return PartitionMapping( partition_column=str(partition_column), mapped_column=str(mapped_column_name), @@ -1824,6 +1874,7 @@ def _evaluate_with_text_forms( values: list[Any], errors: list[str] | None, text_answers: list[tuple[int, Any]], + fresh: bool = False, ) -> tuple[bool, list[Any] | None]: """ `evaluate_transform` with each temporal value also asked as text -- see its @@ -1843,6 +1894,7 @@ def _evaluate_with_text_forms( transform, values + [_as_filter_text(values[index]) for index in indexes], errors=errors, + fresh=fresh, ) if combined is not None: text_answers.extend(zip(indexes, combined[len(values) :], strict=False)) @@ -1854,7 +1906,9 @@ def _evaluate_with_text_forms( # range. The typed values are asked alone, a second round trip only # on this path, and `_declined_for_reading_by_type` checks what they # answer against the instants they were asked about instead. - typed = evaluate_transform(database, catalog, schema, transform, values) + typed = evaluate_transform( + database, catalog, schema, transform, values, fresh=fresh + ) if typed is not None: text_answers.extend((index, TEXT_REFUSED) for index in indexes) return True, typed @@ -1870,6 +1924,7 @@ def evaluate_transform( *, errors: list[str] | None = None, text_answers: list[tuple[int, Any]] | None = None, + fresh: bool = False, ) -> list[Any] | None: """ Evaluate ``transform`` against the engine once per distinct value. @@ -1899,7 +1954,7 @@ def evaluate_transform( if text_answers is not None: answered, result = _evaluate_with_text_forms( - database, catalog, schema, transform, values, errors, text_answers + database, catalog, schema, transform, values, errors, text_answers, fresh ) if answered: return result @@ -1939,6 +1994,11 @@ def evaluate_transform( ) return None + if fresh: + return _fresh_probe_values( + database, catalog, schema, transform, distinct, values, errors + ) + cache_key = _probe_cache_key(database, catalog, schema, transform, distinct) cached = _cache_get(cache_key) if cached is None: @@ -1957,6 +2017,23 @@ def evaluate_transform( return [evaluated[_hashable(value)] for value in values] +def _fresh_probe_values( + database: Database, + catalog: str | None, + schema: str | None, + transform: str, + distinct: list[Any], + values: list[Any], + errors: list[str] | None, +) -> list[Any] | None: + """Evaluate diagnostic samples without reading or recording cached verdicts.""" + result = _probe(database, catalog, schema, transform, distinct, errors=errors) + if result is None: + return None + answers = dict(zip((_hashable(value) for value in distinct), result, strict=True)) + return [answers[_hashable(value)] for value in values] + + def _run_probe( database: Database, catalog: str | None, @@ -2875,6 +2952,15 @@ def preview_partition_mapping( # pylint: disable=too-many-return-statements ): return {"valid": False, "reason": "validation", "error": reason} + if refusal := epoch_mapping_refusal( + datasource, mapped_column, partition_column, value_transform + ): + return { + "valid": False, + "reason": refusal["reason"], + "error": refusal["message"], + } + mapping = PartitionMapping( partition_column=str(partition_column), mapped_column=mapped_column, @@ -3441,7 +3527,12 @@ def build_mirrored_predicates( one of the three whose fix is to stop the transform producing the character. """ - if not requests: + if not requests or epoch_mapping_refusal( + datasource, + mapping.mapped_column, + mapping.partition_column, + mapping.value_transform, + ): return [] partition_column = next( diff --git a/superset/connectors/sqla/partition_validation.py b/superset/connectors/sqla/partition_validation.py new file mode 100644 index 000000000000..1674fdb42c2f --- /dev/null +++ b/superset/connectors/sqla/partition_validation.py @@ -0,0 +1,198 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""Bounded, explicit checks of partition transforms against stored row pairs.""" + +from __future__ import annotations + +from typing import Any, TYPE_CHECKING + +import pandas as pd +from flask_babel import gettext as _ + +from superset.common.query_context_factory import QueryContextFactory +from superset.connectors.sqla.partition_mapping import ( + _declined_for_reading_by_type, + _native_generic_type, + _to_python_scalar, + evaluate_transform, + has_active_advanced_data_type, + stored_expression_error, + validate_partition_mapping, +) +from superset.utils.core import GenericDataType, QueryStatus + +if TYPE_CHECKING: + from superset.connectors.sqla.models import SqlaTable + + +def validate_partition_data( + datasource: SqlaTable, + *, + mapped_column: str, + partition_column: str | None, + value_transform: str | None, + partition_values: list[str], +) -> dict[str, Any]: + """Compare fresh transform outputs with keys from the same authorized rows. + + Partition keys are supplied independently of the transform. Filtering by + its output could exclude precisely the rows that demonstrate a mismatch. + Sampling is diagnostic, never a persistent or universal mirror verdict. + """ + result: dict[str, Any] = { + "status": "inconclusive", + "checked_rows": 0, + "skipped_rows": 0, + "mismatch_count": 0, + "partitions_checked": 0, + "partitions_requested": len(set(partition_values)), + "examples": [], + } + target_name = partition_column or datasource.partition_column + columns = {col.column_name: col for col in datasource.columns} + source = columns.get(mapped_column) + target = columns.get(target_name) + if ( + datasource.sql + or source is None + or target is None + or source.expression + or target.expression + or has_active_advanced_data_type(source) + or _native_generic_type(target) != GenericDataType.NUMERIC + ): + result["message"] = _( + "Data validation requires physical columns and a numeric partition key." + ) + return result + issues = validate_partition_mapping( + column_names=set(columns), + partition_column=target_name, + partition_mapped_column=mapped_column, + main_dttm_col=datasource.main_dttm_col, + transform=value_transform, + engine=datasource.database.backend, + ) + if issues or not value_transform: + result["message"] = _("Correct the mapping expression before validating data.") + return result + if error := stored_expression_error( + datasource.database, datasource.catalog, datasource.schema, value_transform + ): + result["message"] = str(error) + return result + + keys = list(dict.fromkeys(int(value) for value in partition_values)) + result["partitions_requested"] = len(keys) + context = QueryContextFactory().create( + datasource={"type": datasource.type, "id": datasource.id}, + queries=[ + { + "columns": [mapped_column, target_name], + "metrics": [], + "filters": [{"col": target_name, "op": "==", "val": key}], + "row_limit": 50, + "time_range": "No filter", + "orderby": [], + } + for key in keys + ], + force=True, + ) + # Editorship alone does not authorize reading the underlying data. + context.raise_for_access() + failed = False + for query in context.queries: + try: + # The raw datasource result retains exact integers and stored + # timestamps, before display offsets/JSON datetime normalization. + # Query assembly retains RLS; no chart cache or COUNT(*) is used. + sample = datasource.query(query.to_dict()) + if sample.status != QueryStatus.SUCCESS: + failed = True + continue + pairs = [ + (_to_python_scalar(value), _to_python_scalar(key)) + for value, key in sample.df[[mapped_column, target_name]] + .head(50) + .itertuples(index=False, name=None) + ] + if _check_row_pairs(datasource, value_transform, pairs, result): + result["partitions_checked"] += 1 + else: + failed = True + except Exception: # pylint: disable=broad-except + # Never turn an engine failure or incomplete sample into success. + failed = True + if result["mismatch_count"]: + result["status"] = "mismatch" + result["message"] = _("The transform does not match the stored partition keys.") + elif not failed and result["partitions_checked"] == len(keys): + result["status"] = "matched" + result["message"] = _( + "The transform matched the sampled rows, not the entire dataset." + ) + else: + result["message"] = _( + "Some partitions had no checkable rows, or the query or transform failed." + ) + return result + + +def _check_row_pairs( + datasource: SqlaTable, + transform: str, + pairs: list[tuple[Any, Any]], + result: dict[str, Any], +) -> bool: + """Record mismatches and return whether this partition had checkable rows.""" + checkable = [] + for value, key in pairs: + if pd.isna(value) or pd.isna(key): + result["skipped_rows"] += 1 + else: + checkable.append((value, key)) + if not checkable: + return False + inputs = [value for value, _key in checkable] + text_answers: list[tuple[int, Any]] = [] + answers = evaluate_transform( + datasource.database, + datasource.catalog, + datasource.schema, + transform, + inputs, + text_answers=text_answers, + fresh=True, + ) + if answers is None or _declined_for_reading_by_type( + inputs, answers, text_answers, [] + ): + return False + for (value, key), answer in zip(checkable, answers, strict=True): + result["checked_rows"] += 1 + if answer != key: + result["mismatch_count"] += 1 + if len(result["examples"]) < 5: + result["examples"].append( + { + "source_value": str(value), + "stored_key": str(key), + "transformed_value": None if answer is None else str(answer), + } + ) + return True diff --git a/superset/datasets/api.py b/superset/datasets/api.py index c7977f3a93db..234a062aaa68 100644 --- a/superset/datasets/api.py +++ b/superset/datasets/api.py @@ -76,6 +76,7 @@ ) from superset.connectors.sqla.models import SqlaTable from superset.connectors.sqla.partition_mapping import preview_partition_mapping +from superset.connectors.sqla.partition_validation import validate_partition_data from superset.constants import MODEL_API_RW_METHOD_PERMISSION_MAP, RouteMethod from superset.daos.dashboard import DashboardDAO from superset.daos.dataset import DatasetDAO @@ -2212,13 +2213,18 @@ def partition_mapping_preview(self, pk: int) -> Response: properties: valid: type: boolean + description: >- + Expression/predicate evaluation succeeded; + not a guarantee of partition correspondence. reason: type: string description: >- - Why the mapping is not valid. Absent when it is. + Why predicate evaluation was declined. + Absent on evaluation success. The editor branches on this to decide how to present the failure. enum: + - unbucketed_epoch - unconfigured - validation - parse @@ -2229,6 +2235,36 @@ def partition_mapping_preview(self, pk: int) -> Response: - transform_escaping - engine - type + data_validation: + type: object + properties: + status: + type: string + enum: [not_checked, matched, mismatch, inconclusive] + checked_rows: + type: integer + skipped_rows: + type: integer + mismatch_count: + type: integer + partitions_checked: + type: integer + partitions_requested: + type: integer + message: + type: string + examples: + type: array + items: + type: object + properties: + source_value: + type: string + stored_key: + type: string + transformed_value: + type: string + nullable: true sample_input: type: string emitted_predicate: @@ -2280,18 +2316,28 @@ def partition_mapping_preview(self, pk: int) -> Response: ), ) - return self.response( - 200, - result=preview_partition_mapping( - dataset, - mapped_column=payload["mapped_column"], - value_transform=payload["value_transform"], - sample_values=payload["sample_values"], - operator=FilterOperator(payload["operator"]), - is_monotonic=payload["is_monotonic"], - partition_column=payload["partition_column"], - ), + result = preview_partition_mapping( + dataset, + mapped_column=payload["mapped_column"], + value_transform=payload["value_transform"], + sample_values=payload["sample_values"], + operator=FilterOperator(payload["operator"]), + is_monotonic=payload["is_monotonic"], + partition_column=payload["partition_column"], ) + result["data_validation"] = {"status": "not_checked"} + if keys := payload["validation_partition_values"]: + try: + result["data_validation"] = validate_partition_data( + dataset, + mapped_column=payload["mapped_column"], + partition_column=payload["partition_column"], + value_transform=payload["value_transform"], + partition_values=keys, + ) + except SupersetSecurityException: + return self.response_403() + return self.response(200, result=result) @expose("//drill_info/", methods=("GET",)) @protect() diff --git a/superset/datasets/schemas.py b/superset/datasets/schemas.py index 50b46b64c3a9..73742d1d5c34 100644 --- a/superset/datasets/schemas.py +++ b/superset/datasets/schemas.py @@ -29,7 +29,7 @@ validates_schema, ValidationError, ) -from marshmallow.validate import Length, OneOf, Range +from marshmallow.validate import Length, OneOf, Range, Regexp from superset import security_manager from superset.connectors.sqla.partition_mapping import ( @@ -636,6 +636,17 @@ class PartitionMappingPreviewSchema(Schema): ) }, ) + validation_partition_values = fields.List( + fields.String(validate=[Length(1, 21), Regexp(r"^-?[0-9]+$")]), + load_default=None, + validate=Length(1, 3), + metadata={ + "description": ( + "One to three existing integer partition keys " + "for explicit data validation" + ) + }, + ) operator = fields.String( # `=` mirrors under any transform, so the default is meaningful on its # own. A range default would refuse unless `is_monotonic` came with it. diff --git a/superset/db_engine_specs/hive.py b/superset/db_engine_specs/hive.py index b85868ea7735..a62f3bd29407 100644 --- a/superset/db_engine_specs/hive.py +++ b/superset/db_engine_specs/hive.py @@ -119,9 +119,8 @@ class HiveEngineSpec(PrestoEngineSpec): supports_dynamic_schema = True supports_cross_catalog_queries = False - # Epoch-integer partition keys are the common Hive layout, and the - # one-argument form takes the bound being mirrored rather than "now". - partition_value_transform_default = "unix_timestamp(:value)" + # A numeric key does not reveal its bucket size or timezone. + partition_value_transform_default = None # Explicitly opt out (overriding the inherited PrestoEngineSpec value): # Hive/Spark's GROUPING SETS + GROUPING() marker semantics have not been # verified against this query pattern, so fall back to one query per diff --git a/superset/db_engine_specs/impala.py b/superset/db_engine_specs/impala.py index e5134e21b947..6b79f1822a85 100644 --- a/superset/db_engine_specs/impala.py +++ b/superset/db_engine_specs/impala.py @@ -52,9 +52,8 @@ class ImpalaEngineSpec(BaseEngineSpec): # ``partition_col = T(v)`` agrees with the ``col = v`` it stands in for. binary_string_comparison = True - # Epoch-integer partition keys are the common Impala layout, and the - # one-argument form takes the bound being mirrored rather than "now". - partition_value_transform_default = "unix_timestamp(:value)" + # A numeric key does not reveal its bucket size or timezone. + partition_value_transform_default = None metadata = { "description": ( diff --git a/tests/unit_tests/connectors/sqla/partition_validation_test.py b/tests/unit_tests/connectors/sqla/partition_validation_test.py new file mode 100644 index 000000000000..84d5349d4e27 --- /dev/null +++ b/tests/unit_tests/connectors/sqla/partition_validation_test.py @@ -0,0 +1,338 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +"""Partition validation compares row pairs, not membership in a set of keys.""" + +from datetime import datetime +from types import SimpleNamespace +from typing import Any +from unittest.mock import MagicMock, patch, PropertyMock + +import pandas as pd +import pytest +from flask import Flask + +from superset.connectors.sqla.partition_mapping import ( + build_mirrored_predicates, + epoch_mapping_refusal, + evaluate_transform, + PartitionMapping, + preview_partition_mapping, + resolve_partition_mapping, +) +from superset.connectors.sqla.partition_validation import validate_partition_data +from superset.db_engine_specs.ascend import AscendEngineSpec +from superset.db_engine_specs.base import BaseEngineSpec +from superset.db_engine_specs.databricks import ( + DatabricksHiveEngineSpec, + DatabricksPythonConnectorEngineSpec, +) +from superset.db_engine_specs.hive import HiveEngineSpec +from superset.db_engine_specs.impala import ImpalaEngineSpec +from superset.db_engine_specs.spark import SparkEngineSpec +from superset.exceptions import SupersetSecurityException +from superset.models.core import Database +from superset.utils.core import FilterOperator, QueryStatus +from tests.unit_tests.models.partition_mirroring_test import _table + + +@pytest.mark.parametrize( + "spec", + [ + HiveEngineSpec, + ImpalaEngineSpec, + SparkEngineSpec, + DatabricksHiveEngineSpec, + AscendEngineSpec, + ], +) +@pytest.mark.parametrize( + "transform", + [ + "unix_timestamp(:value)", + "(UNIX_TIMESTAMP(:value))", + " unix_timestamp( :value ) ", + ], +) +def test_former_default_is_declined_without_probing( + app: Flask, spec: type[BaseEngineSpec], transform: str +) -> None: + """Stored mappings cannot bypass the guard through a positive cached verdict.""" + table = _table(transform=transform) + with ( + app.app_context(), + patch.object( + Database, "db_engine_spec", new_callable=PropertyMock, return_value=spec + ), + patch("superset.connectors.sqla.partition_mapping.evaluate_transform") as probe, + patch( + "superset.connectors.sqla.models.known_mirror_verdict", return_value=True + ), + patch( + "superset.connectors.sqla.partition_mapping.feature_flag_manager.is_feature_enabled", + return_value=True, + ), + ): + assert spec.partition_value_transform_default is None + assert epoch_mapping_refusal(table, "event_time", "dt_epoch", transform) + assert resolve_partition_mapping(table) is None + mapping = PartitionMapping("dt_epoch", "event_time", transform, True, True) + assert ( + build_mirrored_predicates( + table, mapping, [(FilterOperator.EQUALS, "2026-01-15 10:47:23")] + ) + == [] + ) + preview = preview_partition_mapping( + table, + mapped_column="event_time", + value_transform=transform, + sample_values=["2026-01-15 10:47:23"], + ) + assert preview["reason"] == "unbucketed_epoch" + probe.assert_not_called() + + +def test_floor_and_unrelated_databricks_spec_are_not_refused(app: Flask) -> None: + """The refusal is expression- and resolved-spec-specific.""" + table = _table() + with ( + app.app_context(), + patch.object( + Database, + "db_engine_spec", + new_callable=PropertyMock, + return_value=HiveEngineSpec, + ), + ): + assert ( + epoch_mapping_refusal( + table, + "event_time", + "dt_epoch", + "floor(unix_timestamp(:value)/3600)*3600", + ) + is None + ) + with ( + app.app_context(), + patch.object( + Database, + "db_engine_spec", + new_callable=PropertyMock, + return_value=DatabricksPythonConnectorEngineSpec, + ), + ): + assert ( + epoch_mapping_refusal( + table, "event_time", "dt_epoch", "unix_timestamp(:value)" + ) + is None + ) + + +@pytest.mark.parametrize( + "answers,status", + [ + ([3600, 7200], "matched"), + ([7200, 7200], "mismatch"), + ([None, 7200], "mismatch"), + (None, "inconclusive"), + ], +) +def test_data_validation_checks_corresponding_rows( + app: Flask, answers: list[Any] | None, status: str +) -> None: + """An answer existing in another partition is still wrong for this row.""" + table = _table(transform="floor(:value/3600)*3600") + table.id = 1 + context = MagicMock() + context.queries = [MagicMock()] + sample = SimpleNamespace( + status=QueryStatus.SUCCESS, + df=pd.DataFrame({"event_time": [4000, 8000], "dt_epoch": [3600, 7200]}), + ) + with ( + app.app_context(), + patch( + "superset.connectors.sqla.partition_validation.QueryContextFactory" + ) as factory, + patch.object(table, "query", return_value=sample), + patch( + "superset.connectors.sqla.partition_validation.evaluate_transform", + return_value=answers, + ) as probe, + ): + factory.return_value.create.return_value = context + result = validate_partition_data( + table, + mapped_column="event_time", + partition_column="dt_epoch", + value_transform="floor(:value/3600)*3600", + partition_values=["3600"], + ) + assert result["status"] == status + context.raise_for_access.assert_called_once() + request = factory.return_value.create.call_args.kwargs["queries"][0] + assert request["filters"] == [{"col": "dt_epoch", "op": "==", "val": 3600}] + assert request["columns"] == ["event_time", "dt_epoch"] + assert request["row_limit"] == 50 + assert request["metrics"] == [] + assert probe.call_args.kwargs["fresh"] is True + if status == "mismatch": + assert result["examples"][0]["stored_key"] == "3600" + + +def test_validation_authorizes_before_reading_rows(app: Flask) -> None: + """An editor without data access cannot read sample pairs.""" + table = _table() + table.id = 1 + with ( + app.app_context(), + patch( + "superset.connectors.sqla.partition_validation.QueryContextFactory" + ) as factory, + patch.object(table, "query") as query, + ): + factory.return_value.create.return_value.raise_for_access.side_effect = ( + SupersetSecurityException(MagicMock()) + ) + with pytest.raises(SupersetSecurityException): + validate_partition_data( + table, + mapped_column="event_time", + partition_column="dt_epoch", + value_transform="unix_timestamp(:value)", + partition_values=["3600"], + ) + query.assert_not_called() + + +@pytest.mark.parametrize("values", [[], [None], [datetime(2026, 1, 15, 10, 47)]]) +def test_empty_null_or_failed_sample_cannot_pass(app: Flask, values: list[Any]) -> None: + """Empty coverage and failed evaluations are inconclusive, never matched.""" + table = _table() + table.id = 1 + context = MagicMock() + context.queries = [MagicMock()] + sample = SimpleNamespace( + status=QueryStatus.SUCCESS, + df=pd.DataFrame({"event_time": values, "dt_epoch": [3600] * len(values)}), + ) + with ( + app.app_context(), + patch( + "superset.connectors.sqla.partition_validation.QueryContextFactory" + ) as factory, + patch.object(table, "query", return_value=sample), + patch( + "superset.connectors.sqla.partition_validation.evaluate_transform", + return_value=None, + ), + ): + factory.return_value.create.return_value = context + assert ( + validate_partition_data( + table, + mapped_column="event_time", + partition_column="dt_epoch", + value_transform="unix_timestamp(:value)", + partition_values=["3600"], + )["status"] + == "inconclusive" + ) + + +def test_fresh_validation_does_not_read_or_write_probe_or_verdict_cache( + app: Flask, +) -> None: + """A previous successful probe is not evidence about these rows.""" + table = _table() + with ( + app.app_context(), + patch( + "superset.connectors.sqla.partition_mapping._probe", return_value=[3600] + ) as probe, + patch("superset.connectors.sqla.partition_mapping._cache_get") as cache_get, + patch("superset.connectors.sqla.partition_mapping._cache_set") as cache_set, + patch( + "superset.connectors.sqla.partition_mapping.record_mirror_verdict" + ) as verdict, + ): + assert evaluate_transform( + table.database, None, None, ":value", [4000, 4000], fresh=True + ) == [3600, 3600] + assert probe.call_args.args[4] == [4000] + cache_get.assert_not_called() + cache_set.assert_not_called() + verdict.assert_not_called() + + +def test_real_sampling_query_preserves_partition_filter_and_rls(app: Flask) -> None: + """Build and execute the sampling query, rather than mocking returned pairs.""" + import sqlite3 + + from superset.common.query_context import QueryContext + from superset.common.query_context_factory import QueryContextFactory + + table = _table(transform="floor(:value/3600)*3600") + table.id = 1 + table.columns[0].type = "BIGINT" + table.columns[0].is_dttm = False + connection = sqlite3.connect(":memory:") + connection.execute( + "CREATE TABLE web_events (event_time BIGINT, dt_epoch BIGINT, country TEXT)" + ) + connection.executemany( + "INSERT INTO web_events VALUES (?, ?, ?)", + [(4000, 3600, "allowed"), (4000, 7200, "hidden"), (8000, 7200, "allowed")], + ) + executed = [] + + def fetch(sql: str, *args: object, **kwargs: Any) -> pd.DataFrame: + executed.append(sql) + frame = pd.read_sql_query(sql, connection) + if mutator := kwargs.get("mutator"): + frame = mutator(frame) + return frame + + import sqlalchemy as sa + + with ( + app.app_context(), + patch.object(QueryContextFactory, "_convert_to_model", return_value=table), + patch.object(QueryContext, "raise_for_access"), + patch.object( + table, + "get_sqla_row_level_filters", + return_value=[sa.text("country = 'allowed'")], + ), + patch.object(Database, "get_df", side_effect=fetch), + ): + result = validate_partition_data( + table, + mapped_column="event_time", + partition_column="dt_epoch", + value_transform=":value - :value % 3600", + partition_values=["3600", "7200"], + ) + assert result["status"] == "matched" + assert result["checked_rows"] == 2 + reads = [sql for sql in executed if "FROM web_events" in sql] + assert len(reads) == 2 + assert all("LIMIT 50" in sql and "country = 'allowed'" in sql for sql in reads) + assert all("COUNT(" not in sql.upper() for sql in executed) + connection.close() diff --git a/tests/unit_tests/datasets/partition_mapping_preview_test.py b/tests/unit_tests/datasets/partition_mapping_preview_test.py index b2a89e21a7fe..ae6b9f8e2d81 100644 --- a/tests/unit_tests/datasets/partition_mapping_preview_test.py +++ b/tests/unit_tests/datasets/partition_mapping_preview_test.py @@ -127,6 +127,7 @@ def test_preview_returns_the_emitted_predicate( assert response.status_code == 200 assert response.json["result"] == { + "data_validation": {"status": "not_checked"}, "valid": True, "sample_input": "event_time == '2026-01-15 00:00:00'", "emitted_predicate": "dt_epoch = 1768435200 OR dt_epoch IS NULL", @@ -152,6 +153,7 @@ def test_preview_mirrors_a_range_when_the_transform_is_monotonic( ) assert response.json["result"] == { + "data_validation": {"status": "not_checked"}, "valid": True, "sample_input": "event_time >= '2026-01-15 00:00:00'", "emitted_predicate": "dt_epoch >= 1768435200 OR dt_epoch IS NULL", @@ -183,6 +185,7 @@ def test_preview_shows_a_strict_bound_mirroring_non_strictly( ) assert response.json["result"] == { + "data_validation": {"status": "not_checked"}, "valid": True, "sample_input": "event_time < '2026-01-15 00:00:00'", "emitted_predicate": "dt_epoch <= 1768435200 OR dt_epoch IS NULL", @@ -265,6 +268,7 @@ def test_preview_mirrors_in_element_wise( ) assert response.json["result"] == { + "data_validation": {"status": "not_checked"}, "valid": True, "sample_input": "country IN ('US', 'CA')", "emitted_predicate": "region_key IN ('us', 'ca') OR region_key IS NULL", @@ -1483,6 +1487,7 @@ def test_preview_accepts_a_transform_that_reads_both_shapes_alike( ) assert response.json["result"] == { + "data_validation": {"status": "not_checked"}, "valid": True, "sample_input": "event_time >= '2026-01-15 10:47:23'", "emitted_predicate": "dt_epoch >= 1768474043 OR dt_epoch IS NULL", diff --git a/tests/unit_tests/datasets/partition_mapping_serialization_test.py b/tests/unit_tests/datasets/partition_mapping_serialization_test.py index ba08b7a4dd7c..0457aa2c79d1 100644 --- a/tests/unit_tests/datasets/partition_mapping_serialization_test.py +++ b/tests/unit_tests/datasets/partition_mapping_serialization_test.py @@ -109,6 +109,7 @@ def test_the_mapping_summary_survives_dashboard_payload_pruning(app: Flask) -> N data = _table().data_for_slices([]) assert data["partition_filter_mapping"] == { + "safety_refusal": None, "partition_column": "dt_epoch", "mapped_column": "event_time", "active": True, @@ -336,6 +337,7 @@ def test_the_mapping_summary_still_names_the_columns_when_inactive( summary = table.data["partition_filter_mapping"] assert summary == { + "safety_refusal": None, "partition_column": "dt_epoch", "mapped_column": "event_time", "active": False, diff --git a/tests/unit_tests/db_engine_specs/test_hive.py b/tests/unit_tests/db_engine_specs/test_hive.py index dc6f9b071e1b..d4f77f6fff5e 100644 --- a/tests/unit_tests/db_engine_specs/test_hive.py +++ b/tests/unit_tests/db_engine_specs/test_hive.py @@ -351,7 +351,7 @@ def test_spark_identifier_quote_uses_backticks() -> None: } -def test_the_partition_transform_default_is_hive_syntax() -> None: +def test_hive_does_not_guess_the_epoch_partition_bucket() -> None: """ `unix_timestamp(:value)` only belongs on engines where it parses. The one-argument form takes the bound being mirrored; the zero-argument form @@ -360,9 +360,9 @@ def test_the_partition_transform_default_is_hive_syntax() -> None: from superset.db_engine_specs.hive import HiveEngineSpec from superset.db_engine_specs.spark import SparkEngineSpec - assert HiveEngineSpec.partition_value_transform_default == "unix_timestamp(:value)" + assert HiveEngineSpec.partition_value_transform_default is None # Spark SQL inherits from Hive and shares the syntax. - assert SparkEngineSpec.partition_value_transform_default == "unix_timestamp(:value)" + assert SparkEngineSpec.partition_value_transform_default is None def test_the_partition_transform_default_is_not_inherited_by_presto() -> None: diff --git a/tests/unit_tests/db_engine_specs/test_impala.py b/tests/unit_tests/db_engine_specs/test_impala.py index f8603e2f5410..0ed72cbe5be3 100644 --- a/tests/unit_tests/db_engine_specs/test_impala.py +++ b/tests/unit_tests/db_engine_specs/test_impala.py @@ -286,12 +286,10 @@ def test_fetch_data_async_result_set(app_context: None, impala_errors: None) -> cursor.cancel_operation.assert_not_called() -def test_the_partition_transform_default_is_impala_syntax() -> None: +def test_impala_does_not_guess_the_epoch_partition_bucket() -> None: from superset.db_engine_specs.impala import ImpalaEngineSpec - assert ( - ImpalaEngineSpec.partition_value_transform_default == "unix_timestamp(:value)" - ) + assert ImpalaEngineSpec.partition_value_transform_default is None def test_engines_without_a_sensible_default_offer_none() -> None: diff --git a/tests/unit_tests/models/partition_mirroring_test.py b/tests/unit_tests/models/partition_mirroring_test.py index 8384cea96699..15daf90c86c6 100644 --- a/tests/unit_tests/models/partition_mirroring_test.py +++ b/tests/unit_tests/models/partition_mirroring_test.py @@ -3278,3 +3278,82 @@ def test_an_array_partition_column_gets_no_mirror(app: Flask) -> None: # The filter itself is untouched: the query is still correct, it just reads # every partition. assert "dt_epoch = 5" in sql + + +@pytest.mark.parametrize("bucket", [3600, 86400]) +@pytest.mark.parametrize("operator", ["==", "IN", ">", ">=", "<", "<=", "range"]) +def test_epoch_bucket_queries_preserve_actual_rows( + app: Flask, bucket: int, operator: str +) -> None: + """Execute generated SQL and compare rows against independently built keys.""" + import math + import sqlite3 + from datetime import timezone + + connection = sqlite3.connect(":memory:") + connection.create_function("floor", 1, math.floor) + connection.create_function( + "unix_timestamp", + 1, + lambda value: int( + datetime.fromisoformat(value).replace(tzinfo=timezone.utc).timestamp() + ), + ) + connection.execute( + "CREATE TABLE web_events (country TEXT, event_time TEXT, dt_epoch BIGINT)" + ) + origin = 1790812800 # 2026-10-01 UTC + seconds = [-1, 0, 1] + [ + origin + hour * 3600 + offset + for hour in range(48) + for offset in (0, 1, 1800, 3599) + ] + rows: list[tuple[str, str, int | None]] = [ + ( + str(index), + datetime.fromtimestamp(value, timezone.utc).strftime("%Y-%m-%d %H:%M:%S"), + value // bucket * bucket, + ) + for index, value in enumerate(seconds) + ] + rows.append(("null_partition", "2026-10-01 10:30:00", None)) + connection.executemany("INSERT INTO web_events VALUES (?, ?, ?)", rows) + table = _table( + transform=( + f"CAST(floor(unix_timestamp(:value) / {bucket}.0) * {bucket} AS BIGINT)" + ) + ) + if operator == "range": + arguments = { + "granularity": "event_time", + "from_dttm": datetime(2026, 10, 1, 10, 30), + "to_dttm": datetime(2026, 10, 2, 10, 30), + } + else: + arguments = { + "filter": [ + { + "col": "event_time", + "op": operator, + "val": ["2026-10-01 10:30:00", "2026-10-02 11:59:59"] + if operator == "IN" + else "2026-10-01 10:30:00", + } + ] + } + with ( + app.app_context(), + patch.object( + Database, + "get_df", + side_effect=lambda sql, **kwargs: pd.read_sql_query(sql, connection), + ), + ): + mirrored_sql = _query(table, **arguments) + table.partition_column = None + unmirrored_sql = _query(table, **arguments) + assert "dt_epoch" in mirrored_sql + assert sorted(connection.execute(mirrored_sql).fetchall()) == sorted( + connection.execute(unmirrored_sql).fetchall() + ) + connection.close() From b610f35c06fcdff430ed38f3e74a7edfcf80e05a Mon Sep 17 00:00:00 2001 From: Hugh A Miles II Date: Thu, 29 Oct 2026 09:29:06 -0400 Subject: [PATCH 02/11] fix(partition-mapping): parse the refused epoch default through SQLStatement Direct sqlglot use is disallowed here, and it let a tokenizer error from a half-typed transform escape the dataset summary. Compare projections via SQLStatement, which already maps tokenizer errors to parse errors. Co-Authored-By: Claude Opus 5.5 --- superset/connectors/sqla/partition_mapping.py | 15 +++++++------- .../connectors/sqla/partition_validation.py | 4 ++-- superset/sql/parse.py | 16 +++++++++++++++ .../sqla/partition_validation_test.py | 20 +++++++++++++++++++ tests/unit_tests/sql/parse_tests.py | 15 ++++++++++++++ 5 files changed, 61 insertions(+), 9 deletions(-) diff --git a/superset/connectors/sqla/partition_mapping.py b/superset/connectors/sqla/partition_mapping.py index 104641045c20..7c4ad5db6250 100644 --- a/superset/connectors/sqla/partition_mapping.py +++ b/superset/connectors/sqla/partition_mapping.py @@ -191,7 +191,6 @@ import numpy as np import pandas as pd import sqlalchemy as sa -import sqlglot from dateutil.relativedelta import relativedelta from flask import current_app as app from flask_babel import lazy_gettext as _ @@ -1144,12 +1143,14 @@ def epoch_mapping_refusal( or _native_generic_type(target) != utils.GenericDataType.NUMERIC ): return None - try: - expression = sqlglot.parse_one(parse_skeleton(transform), read="hive").unnest() - former_default = sqlglot.parse_one("unix_timestamp(NULL)", read="hive") - if expression != former_default: - return None - except sqlglot.errors.ParseError: + engine = datasource.database.backend + candidate = _parse_skeleton(transform, engine) + former_default = _parse_skeleton("unix_timestamp(:value)", engine) + if ( + candidate is None + or former_default is None + or not candidate.has_same_projection(former_default) + ): return None return { "reason": "unbucketed_epoch", diff --git a/superset/connectors/sqla/partition_validation.py b/superset/connectors/sqla/partition_validation.py index 1674fdb42c2f..50de1061c6e2 100644 --- a/superset/connectors/sqla/partition_validation.py +++ b/superset/connectors/sqla/partition_validation.py @@ -33,7 +33,7 @@ stored_expression_error, validate_partition_mapping, ) -from superset.utils.core import GenericDataType, QueryStatus +from superset.utils.core import GenericDataType, QueryStatus, remove_duplicates if TYPE_CHECKING: from superset.connectors.sqla.models import SqlaTable @@ -96,7 +96,7 @@ def validate_partition_data( result["message"] = str(error) return result - keys = list(dict.fromkeys(int(value) for value in partition_values)) + keys = remove_duplicates(int(value) for value in partition_values) result["partitions_requested"] = len(keys) context = QueryContextFactory().create( datasource={"type": datasource.type, "id": datasource.id}, diff --git a/superset/sql/parse.py b/superset/sql/parse.py index 3627d6362451..4bb55836c211 100644 --- a/superset/sql/parse.py +++ b/superset/sql/parse.py @@ -1390,6 +1390,22 @@ def count_select_expressions(self) -> int: return 0 return len(self._parsed.expressions) + def has_same_projection(self, other: SQLStatement) -> bool: + """ + Whether both statements select one structurally equal expression. + + Redundant parentheses, letter case, whitespace and comments do not + count as differences, so a caller can recognize a known expression + however it was typed. + """ + projections = [ + statement._parsed.expressions[0].unnest() + for statement in (self, other) + if isinstance(statement._parsed, exp.Select) + and len(statement._parsed.expressions) == 1 + ] + return len(projections) == 2 and projections[0] == projections[1] + def is_bare_select_expression(self) -> bool: """ Whether this is ``SELECT `` and nothing else. diff --git a/tests/unit_tests/connectors/sqla/partition_validation_test.py b/tests/unit_tests/connectors/sqla/partition_validation_test.py index 84d5349d4e27..64c8a00dc11e 100644 --- a/tests/unit_tests/connectors/sqla/partition_validation_test.py +++ b/tests/unit_tests/connectors/sqla/partition_validation_test.py @@ -144,6 +144,26 @@ def test_floor_and_unrelated_databricks_spec_are_not_refused(app: Flask) -> None ) +def test_half_typed_transform_is_not_refused_and_does_not_raise(app: Flask) -> None: + """An unterminated quote tokenizes badly; the dataset must still load.""" + table = _table(transform="unix_timestamp(':value)") + with ( + app.app_context(), + patch.object( + Database, + "db_engine_spec", + new_callable=PropertyMock, + return_value=HiveEngineSpec, + ), + ): + assert ( + epoch_mapping_refusal( + table, "event_time", "dt_epoch", "unix_timestamp(':value)" + ) + is None + ) + + @pytest.mark.parametrize( "answers,status", [ diff --git a/tests/unit_tests/sql/parse_tests.py b/tests/unit_tests/sql/parse_tests.py index 56f485e011e4..a97dfe376a94 100644 --- a/tests/unit_tests/sql/parse_tests.py +++ b/tests/unit_tests/sql/parse_tests.py @@ -7753,6 +7753,21 @@ def test_count_select_expressions(sql: str, engine: str, expected: int) -> None: assert SQLStatement(sql, engine).count_select_expressions() == expected +@pytest.mark.parametrize( + "sql, expected", + [ + ("SELECT (UNIX_TIMESTAMP(NULL)) -- note", True), + ("SELECT unix_timestamp( NULL )", True), + ("SELECT floor(unix_timestamp(NULL) / 3600) * 3600", False), + ("SELECT unix_timestamp(NULL), 1", False), + ], +) +def test_has_same_projection(sql: str, expected: bool) -> None: + """Check the `has_same_projection` method.""" + reference = SQLStatement("SELECT unix_timestamp(NULL)", "hive") + assert SQLStatement(sql, "hive").has_same_projection(reference) is expected + + @pytest.mark.parametrize( "sql, engine, expected", [ From c1bb0967d5a0fd85c149ca4974f260bb84511621 Mon Sep 17 00:00:00 2001 From: Hugh A Miles II Date: Thu, 29 Oct 2026 09:40:40 -0400 Subject: [PATCH 03/11] docs(api): regenerate OpenAPI spec for partition data validation Co-Authored-By: Claude Opus 5.5 --- docs/static/resources/openapi.json | 68 +++++++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 1 deletion(-) diff --git a/docs/static/resources/openapi.json b/docs/static/resources/openapi.json index dfdbf9fdc984..e38bb28b2587 100644 --- a/docs/static/resources/openapi.json +++ b/docs/static/resources/openapi.json @@ -8537,6 +8537,20 @@ "minItems": 1, "type": "array" }, + "validation_partition_values": { + "default": null, + "description": "One to three existing integer partition keys for explicit data validation", + "items": { + "maxLength": 21, + "minLength": 1, + "pattern": "^-?[0-9]+$", + "type": "string" + }, + "maxItems": 3, + "minItems": 1, + "nullable": true, + "type": "array" + }, "value_transform": { "description": "SQL expression containing a :value placeholder", "maxLength": 1024, @@ -25816,6 +25830,56 @@ "properties": { "result": { "properties": { + "data_validation": { + "properties": { + "checked_rows": { + "type": "integer" + }, + "examples": { + "items": { + "properties": { + "source_value": { + "type": "string" + }, + "stored_key": { + "type": "string" + }, + "transformed_value": { + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "message": { + "type": "string" + }, + "mismatch_count": { + "type": "integer" + }, + "partitions_checked": { + "type": "integer" + }, + "partitions_requested": { + "type": "integer" + }, + "skipped_rows": { + "type": "integer" + }, + "status": { + "enum": [ + "not_checked", + "matched", + "mismatch", + "inconclusive" + ], + "type": "string" + } + }, + "type": "object" + }, "emitted_predicate": { "type": "string" }, @@ -25823,8 +25887,9 @@ "type": "string" }, "reason": { - "description": "Why the mapping is not valid. Absent when it is. The editor branches on this to decide how to present the failure.", + "description": "Why predicate evaluation was declined. Absent on evaluation success. The editor branches on this to decide how to present the failure.", "enum": [ + "unbucketed_epoch", "unconfigured", "validation", "parse", @@ -25842,6 +25907,7 @@ "type": "string" }, "valid": { + "description": "Expression/predicate evaluation succeeded; not a guarantee of partition correspondence.", "type": "boolean" } }, From 3e4718c99077611f6c778f38806c77f6889fea97 Mon Sep 17 00:00:00 2001 From: Hugh A Miles II Date: Thu, 29 Oct 2026 10:02:07 -0400 Subject: [PATCH 04/11] chore(i18n): regenerate message catalogs for partition data validation Co-Authored-By: Claude Opus 5.5 --- .../translations/ar/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/ca/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/cs/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/de/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/en/LC_MESSAGES/messages.po | 61 +++++++++++++++++- .../translations/es/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/fa/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/fi/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/fr/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/it/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/ja/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/ko/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/lv/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- superset/translations/messages.pot | 56 ++++++++++++++++- .../translations/mi/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/nl/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/pl/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/pt/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../pt_BR/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/ro/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/ru/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/sk/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/sl/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/sr/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../sr_Latn/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/ta/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/th/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/tr/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/uk/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../translations/zh/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- .../zh_TW/LC_MESSAGES/messages.po | 63 +++++++++++++++++-- 31 files changed, 1822 insertions(+), 122 deletions(-) diff --git a/superset/translations/ar/LC_MESSAGES/messages.po b/superset/translations/ar/LC_MESSAGES/messages.po index e8e1988e23a5..0004f7e66dff 100644 --- a/superset/translations/ar/LC_MESSAGES/messages.po +++ b/superset/translations/ar/LC_MESSAGES/messages.po @@ -24,7 +24,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2024-07-14 15:10+0300\n" "Last-Translator: Abdalrahim G. Fakhouri \n" "Language: ar\n" @@ -4323,6 +4323,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "موضع تسمية الطفل" @@ -5376,6 +5381,9 @@ msgstr "مع عنوان فرعي" msgid "Corner Radius" msgstr "الشعاع الداخلي" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "الارتباط" @@ -6091,6 +6099,12 @@ msgstr "تم تحديث البيانات" msgid "Data type" msgstr "نوع البيانات" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "يتضمن DataFrame سلسلة واحدة على الأقل" @@ -7999,6 +8013,9 @@ msgstr "أدخل القيم الدنيا والقصوى لفلتر النطاق" msgid "Enter report name" msgstr "اسم التقرير" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -8316,6 +8333,12 @@ msgstr "مجموعة البيانات الحالية" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -8520,6 +8543,9 @@ msgstr "تعبير SQL" msgid "Expression cannot be empty" msgstr "لا يمكن أن تكون فارغة" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -11250,6 +11276,10 @@ msgstr "مطابقة لون إزاحة الوقت مع السلسلة الأصل msgid "Match type" msgstr "نوع البيانات" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] #, fuzzy @@ -13072,6 +13102,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -13882,6 +13915,12 @@ msgstr "الترتيب" msgid "Ratio" msgstr "نسبة" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "السجلات الخام" @@ -16654,6 +16693,9 @@ msgstr "تعذّر حل بعض المجموعات وتُعرض كمعرّفات. msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -16853,6 +16895,10 @@ msgstr "فئة المصدر" msgid "Source location" msgstr "فئة المصدر" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "سباركلاين" @@ -18827,6 +18873,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -18836,6 +18885,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -21295,13 +21347,13 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "يستخدم أول 25 قيمة إذا احتوى البُعد على قيم أكثر." -msgid "Valid" -msgstr "" - #, fuzzy msgid "Valid SQL expression" msgstr "تعبير SQL" +msgid "Validate against data" +msgstr "" + #, fuzzy msgid "Validate query" msgstr "عرض الاستعلام" @@ -21320,6 +21372,9 @@ msgstr "التحقق من الاتصال لـ %s" msgid "Validating..." msgstr "جارٍ التحميل…" +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "القيمة " diff --git a/superset/translations/ca/LC_MESSAGES/messages.po b/superset/translations/ca/LC_MESSAGES/messages.po index e415edc9e62b..84525d5fd9dc 100644 --- a/superset/translations/ca/LC_MESSAGES/messages.po +++ b/superset/translations/ca/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2025-06-27 12:56+0200\n" "Last-Translator: FULL NAME \n" "Language: ca\n" @@ -4140,6 +4140,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Posició de l'etiqueta filla" @@ -5163,6 +5168,9 @@ msgstr "Amb un subtítol" msgid "Corner Radius" msgstr "Radi de Cantonada" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Correlació" @@ -5863,6 +5871,12 @@ msgstr "Dades actualitzades" msgid "Data type" msgstr "Tipus de dades" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "El DataFrame ha d'incloure almenys una sèrie" @@ -7672,6 +7686,9 @@ msgstr "Introduïu els valors mínim i màxim per al filtre de rang" msgid "Enter report name" msgstr "Introdueix nom de l'informe" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7964,6 +7981,12 @@ msgstr "Conjunt de dades existent" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -8168,6 +8191,9 @@ msgstr "Expressió SQL" msgid "Expression cannot be empty" msgstr "no pot estar buit" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10841,6 +10867,10 @@ msgstr "Coincidir color de desplaçament temporal amb sèrie original" msgid "Match type" msgstr "Tipus de dades" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] #, fuzzy @@ -12627,6 +12657,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -13398,6 +13431,12 @@ msgstr "Classificació" msgid "Ratio" msgstr "Proporció" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Registres en brut" @@ -16113,6 +16152,9 @@ msgstr "Alguns grups no s'han pogut resoldre i es mostren com a IDs." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -16320,6 +16362,10 @@ msgstr "Categoria font" msgid "Source location" msgstr "Categoria font" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Línia de tendència" @@ -18254,6 +18300,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -18263,6 +18312,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -20693,13 +20745,13 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Utilitza els primers 25 valors si la dimensió en té més." -msgid "Valid" -msgstr "" - #, fuzzy msgid "Valid SQL expression" msgstr "Expressió SQL" +msgid "Validate against data" +msgstr "" + #, fuzzy msgid "Validate query" msgstr "Veure consulta" @@ -20716,6 +20768,9 @@ msgstr "Validant connectivitat per %s" msgid "Validating..." msgstr "Carregant..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Valor" diff --git a/superset/translations/cs/LC_MESSAGES/messages.po b/superset/translations/cs/LC_MESSAGES/messages.po index 6356302a9edb..498982faed9e 100644 --- a/superset/translations/cs/LC_MESSAGES/messages.po +++ b/superset/translations/cs/LC_MESSAGES/messages.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2016-05-02 08:49-0700\n" "Last-Translator: Jan Šmejkal \n" "Language: cs\n" @@ -4026,6 +4026,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Pozice popisku podřízené položky" @@ -5008,6 +5013,9 @@ msgstr "Kopírovat s hlavičkami" msgid "Corner Radius" msgstr "Poloměr rohu" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Korelace" @@ -5679,6 +5687,12 @@ msgstr "Data obnovena" msgid "Data type" msgstr "Datový typ" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "Datový rámec musí obsahovat alespoň jednu sérii" @@ -7442,6 +7456,9 @@ msgstr "Zadejte minimální a maximální hodnoty pro filtr rozsahu" msgid "Enter report name" msgstr "Zadejte název reportu" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7727,6 +7744,12 @@ msgstr "Existující sada dat" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -7928,6 +7951,9 @@ msgstr "SQL výraz" msgid "Expression cannot be empty" msgstr "Výraz nesmí být prázdný" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10487,6 +10513,10 @@ msgstr "Sladit barvu časového posunu s původní sérií" msgid "Match type" msgstr "Datový typ" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + msgid "Matrixify" msgstr "Matrixify" @@ -12234,6 +12264,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -12990,6 +13023,12 @@ msgstr "Pořadí" msgid "Ratio" msgstr "Poměr" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Nezpracované záznamy" @@ -15623,6 +15662,9 @@ msgstr "Některé skupiny nebylo možné rozlišit a zobrazují se jako ID." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -15825,6 +15867,10 @@ msgstr "Zdrojová kategorie" msgid "Source location" msgstr "Zdrojová kategorie" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Minigraf" @@ -17674,6 +17720,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -17683,6 +17732,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -20012,13 +20064,13 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Použije prvních 25 hodnot, pokud dimenze obsahuje více." -msgid "Valid" -msgstr "" - #, fuzzy msgid "Valid SQL expression" msgstr "Platný SQL výraz" +msgid "Validate against data" +msgstr "" + #, fuzzy msgid "Validate query" msgstr "Ověřit dotaz" @@ -20035,6 +20087,9 @@ msgstr "Ověřuje se konektivita pro %s" msgid "Validating..." msgstr "Ověřování..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Hodnota" diff --git a/superset/translations/de/LC_MESSAGES/messages.po b/superset/translations/de/LC_MESSAGES/messages.po index 814d19a00ae5..982cad5fb4cd 100644 --- a/superset/translations/de/LC_MESSAGES/messages.po +++ b/superset/translations/de/LC_MESSAGES/messages.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2023-04-07 19:45+0200\n" "Last-Translator: Holger Bruch \n" "Language: de\n" @@ -3963,6 +3963,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Untergeordnete Beschriftungsposition" @@ -4940,6 +4945,9 @@ msgstr "Mit Kopfzeilen kopieren" msgid "Corner Radius" msgstr "Eckenradius" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Korrelation" @@ -5598,6 +5606,12 @@ msgstr "Daten aktualisiert" msgid "Data type" msgstr "Datentyp" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "DataFrame mit mindestens eine Zeitreihe enhalten" @@ -7295,6 +7309,9 @@ msgstr "Mindest- und Höchstwert für den Bereichsfilter eingeben" msgid "Enter report name" msgstr "Name des Berichts" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7567,6 +7584,12 @@ msgstr "Vorhandener Datensatz" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -7754,6 +7777,9 @@ msgstr "Ausdrücke" msgid "Expression cannot be empty" msgstr "Ausdruck darf nicht leer sein" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10240,6 +10266,10 @@ msgstr "Farbe der Zeitverschiebung an die Originalserie anpassen" msgid "Match type" msgstr "Vergleichstyp" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + msgid "Matrixify" msgstr "Matrixify" @@ -11959,6 +11989,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -12700,6 +12733,12 @@ msgstr "Rangliste" msgid "Ratio" msgstr "Verhältnis" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Roheinträge" @@ -15225,6 +15264,9 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + msgid "Some permissions could not be resolved and are shown as IDs." msgstr "" "Einige Berechtigungen konnten nicht aufgelöst werden und werden als IDs " @@ -15421,6 +15463,10 @@ msgstr "Quellkategorie" msgid "Source location" msgstr "Quellort" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Sparkline" @@ -17292,6 +17338,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -17301,6 +17350,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -19623,12 +19675,12 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Verwendet die ersten 25 Werte, falls die Dimension mehr enthält." -msgid "Valid" -msgstr "" - msgid "Valid SQL expression" msgstr "Gültiger SQL-Ausdruck" +msgid "Validate against data" +msgstr "" + msgid "Validate query" msgstr "Abfrage prüfen" @@ -19642,6 +19694,9 @@ msgstr "Prüfe Verbindung für %s" msgid "Validating..." msgstr "Wird geprüft..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Wert" diff --git a/superset/translations/en/LC_MESSAGES/messages.po b/superset/translations/en/LC_MESSAGES/messages.po index 117a18e65668..4b4a61b58967 100644 --- a/superset/translations/en/LC_MESSAGES/messages.po +++ b/superset/translations/en/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2016-05-02 08:49-0700\n" "Last-Translator: FULL NAME \n" "Language: en\n" @@ -3649,6 +3649,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "" @@ -4553,6 +4558,9 @@ msgstr "" msgid "Corner Radius" msgstr "" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "" @@ -5172,6 +5180,12 @@ msgstr "" msgid "Data type" msgstr "" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "" @@ -6741,6 +6755,9 @@ msgstr "" msgid "Enter report name" msgstr "" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7011,6 +7028,12 @@ msgstr "" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -7194,6 +7217,9 @@ msgstr "" msgid "Expression cannot be empty" msgstr "" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -9563,6 +9589,10 @@ msgstr "" msgid "Match type" msgstr "" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + msgid "Matrixify" msgstr "" @@ -11177,6 +11207,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -11874,6 +11907,12 @@ msgstr "" msgid "Ratio" msgstr "" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "" @@ -14249,6 +14288,9 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + msgid "Some permissions could not be resolved and are shown as IDs." msgstr "" @@ -14426,6 +14468,10 @@ msgstr "" msgid "Source location" msgstr "" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "" @@ -16024,6 +16070,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -16033,6 +16082,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -18089,10 +18141,10 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "" -msgid "Valid" +msgid "Valid SQL expression" msgstr "" -msgid "Valid SQL expression" +msgid "Validate against data" msgstr "" msgid "Validate query" @@ -18108,6 +18160,9 @@ msgstr "" msgid "Validating..." msgstr "" +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "" diff --git a/superset/translations/es/LC_MESSAGES/messages.po b/superset/translations/es/LC_MESSAGES/messages.po index 395a7fca8afe..972a1b2152ac 100644 --- a/superset/translations/es/LC_MESSAGES/messages.po +++ b/superset/translations/es/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2016-05-02 08:49-0700\n" "Last-Translator: FULL NAME \n" "Language: es\n" @@ -4096,6 +4096,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Posición de la etiqueta secundaria" @@ -5106,6 +5111,9 @@ msgstr "Con un subencabezado" msgid "Corner Radius" msgstr "Radio de la esquina" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Correlación" @@ -5803,6 +5811,12 @@ msgstr "Datos actualizados" msgid "Data type" msgstr "Tipo de datos" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "El marco de datos incluye al menos una serie" @@ -7588,6 +7602,9 @@ msgstr "Ingrese los valores mínimo y máximo para el filtro de rango" msgid "Enter report name" msgstr "Introduce el nombre del informe" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7881,6 +7898,12 @@ msgstr "Conjunto de datos existente" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -8079,6 +8102,9 @@ msgstr "Expresión" msgid "Expression cannot be empty" msgstr "no puede estar vacío" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10733,6 +10759,10 @@ msgstr "Hacer coincidir el color del cambio de tiempo con la serie original" msgid "Match type" msgstr "Tipo de datos" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: fr, ru] #, fuzzy msgid "Matrixify" @@ -12516,6 +12546,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -13290,6 +13323,12 @@ msgstr "Clasificación" msgid "Ratio" msgstr "Proporción" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Registros en bruto" @@ -15974,6 +16013,9 @@ msgstr "Algunos grupos no pudieron resolverse y se muestran como IDs." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -16182,6 +16224,10 @@ msgstr "Categoría de fuente" msgid "Source location" msgstr "Ubicación de origen" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Minigráfica" @@ -18141,6 +18187,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -18150,6 +18199,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -20573,13 +20625,13 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Usa los primeros 25 valores si la dimensión tiene más." -msgid "Valid" -msgstr "" - #, fuzzy msgid "Valid SQL expression" msgstr "Expresión SQL" +msgid "Validate against data" +msgstr "" + #, fuzzy msgid "Validate query" msgstr "Ver consulta" @@ -20596,6 +20648,9 @@ msgstr "Validando conectividad para %s" msgid "Validating..." msgstr "Cargando..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Valor" diff --git a/superset/translations/fa/LC_MESSAGES/messages.po b/superset/translations/fa/LC_MESSAGES/messages.po index e7d370d715d4..8364d4f9cae1 100644 --- a/superset/translations/fa/LC_MESSAGES/messages.po +++ b/superset/translations/fa/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2024-10-20 00:07+0330\n" "Last-Translator: Emad Rad \n" "Language: fa\n" @@ -4137,6 +4137,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "موقعیت برچسب کودک" @@ -5179,6 +5184,9 @@ msgstr "با یک زیرعنوان" msgid "Corner Radius" msgstr "شعاع داخلی" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "همبستگی" @@ -5883,6 +5891,12 @@ msgstr "داده‌ها به‌روز شد" msgid "Data type" msgstr "نوع داده" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "DataFrame شامل حداقل یک سری است." @@ -7689,6 +7703,9 @@ msgstr "مقادیر حداقل و حداکثر را برای فیلتر باز msgid "Enter report name" msgstr "نام گزارش را وارد کنید" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7996,6 +8013,12 @@ msgstr "دیتاست موجود" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -8200,6 +8223,9 @@ msgstr "عبارت SQL" msgid "Expression cannot be empty" msgstr "نمی‌تواند خالی باشد" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10908,6 +10934,10 @@ msgstr "تطبیق رنگ جابجایی زمانی با سری اصلی" msgid "Match type" msgstr "نوع داده" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] #, fuzzy @@ -12698,6 +12728,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -13489,6 +13522,12 @@ msgstr "رتبه‌بندی" msgid "Ratio" msgstr "نسبت" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "رکوردهای خام" @@ -16209,6 +16248,9 @@ msgstr "برخی گروه‌ها قابل حل‌وفصل نبودند و به msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -16416,6 +16458,10 @@ msgstr "دسته منبع" msgid "Source location" msgstr "دسته منبع" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "اسپرک‌لاین" @@ -18350,6 +18396,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -18359,6 +18408,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -20795,13 +20847,13 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "اگر بُعد بیشتر داشته باشد، از ۲۵ مقدار اول استفاده می‌کند." -msgid "Valid" -msgstr "" - #, fuzzy msgid "Valid SQL expression" msgstr "عبارت SQL" +msgid "Validate against data" +msgstr "" + #, fuzzy msgid "Validate query" msgstr "مشاهده کوئری" @@ -20820,6 +20872,9 @@ msgstr "در حال تأیید اتصال برای %s" msgid "Validating..." msgstr "در حال بارگذاری..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "مقدار" diff --git a/superset/translations/fi/LC_MESSAGES/messages.po b/superset/translations/fi/LC_MESSAGES/messages.po index c1f22a40e378..1d0201353e7c 100644 --- a/superset/translations/fi/LC_MESSAGES/messages.po +++ b/superset/translations/fi/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: fi\n" @@ -6242,6 +6242,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk, zh, zh_TW] #, fuzzy @@ -7862,6 +7867,9 @@ msgstr "Kopioi otsikoineen" msgid "Corner Radius" msgstr "Kulman säde" +msgid "Correct the mapping expression before validating data." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pt_BR, ru, sk, sl, uk, zh, zh_TW] #, fuzzy @@ -8960,6 +8968,12 @@ msgstr "Tiedot päivitetty" msgid "Data type" msgstr "Tietotyyppi" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, it, ja, lv, mi, nl, pl, pt, pt_BR, ru, sk, sl, uk, zh, # zh_TW] @@ -11820,6 +11834,9 @@ msgstr "Syötä aluesuodattimen minimi- ja maksimiarvot" msgid "Enter report name" msgstr "Syötä raportin nimi" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -12290,6 +12307,12 @@ msgstr "Olemassa oleva tietojoukko" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -12599,6 +12622,9 @@ msgstr "SQL-lauseke" msgid "Expression cannot be empty" msgstr "Lauseke ei voi olla tyhjä" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -16760,6 +16786,10 @@ msgstr "Sovita aikasiirtymän väri alkuperäiseen sarjaan" msgid "Match type" msgstr "Tietotyyppi" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, fr, ja, # lv, ru, sk, uk] #, fuzzy @@ -19591,6 +19621,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk, zh, zh_TW] #, fuzzy @@ -20894,6 +20927,12 @@ msgstr "Sijoitusjärjestys" msgid "Ratio" msgstr "Suhde" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk, zh, zh_TW] #, fuzzy @@ -25081,6 +25120,9 @@ msgstr "Joitakin ryhmiä ei voitu selvittää, ja ne näytetään tunnisteina." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -25412,6 +25454,10 @@ msgstr "Lähdeluokka" msgid "Source location" msgstr "Lähdeluokka" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk] #, fuzzy @@ -28186,6 +28232,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -28195,6 +28244,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -31631,15 +31683,15 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Käyttää ensimmäisiä 25 arvoa, jos dimensiossa on enemmän." -msgid "Valid" -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ja, lv, ru, # uk] #, fuzzy msgid "Valid SQL expression" msgstr "Kelvollinen SQL-lauseke" +msgid "Validate against data" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ja, lv, ru, # uk] #, fuzzy @@ -31664,6 +31716,9 @@ msgstr "Tarkistetaan yhteyttä kohteelle %s" msgid "Validating..." msgstr "Tarkistetaan..." +msgid "Validation inconclusive" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt, pt_BR, ru, sk, sl, tr, uk, zh, # zh_TW] diff --git a/superset/translations/fr/LC_MESSAGES/messages.po b/superset/translations/fr/LC_MESSAGES/messages.po index 574028cab99e..2a6c4bd72c03 100644 --- a/superset/translations/fr/LC_MESSAGES/messages.po +++ b/superset/translations/fr/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2025-06-26 15:34+0200\n" "Last-Translator: \n" "Language: fr\n" @@ -4030,6 +4030,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Position de l'étiquette enfant" @@ -5008,6 +5013,9 @@ msgstr "Copier avec les en-têtes" msgid "Corner Radius" msgstr "Rayon des coins" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Corrélation" @@ -5679,6 +5687,12 @@ msgstr "Données actualisées" msgid "Data type" msgstr "Type de données" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "DataFrame doit comprendre au moins une série" @@ -7397,6 +7411,9 @@ msgstr "Entrer une valeur minimal et maximal pour la plage du filter" msgid "Enter report name" msgstr "Saisir le nom du rapport" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7675,6 +7692,12 @@ msgstr "Jeu de données existant" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -7867,6 +7890,9 @@ msgstr "Expression" msgid "Expression cannot be empty" msgstr "L'expression ne peut pas être vide" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10404,6 +10430,10 @@ msgstr "Associer la couleur du décalage temporel à la série originale" msgid "Match type" msgstr "Correspondance du type" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + msgid "Matrixify" msgstr "Matrixify" @@ -12145,6 +12175,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -12888,6 +12921,12 @@ msgstr "Rang" msgid "Ratio" msgstr "Ratio" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Registres bruts" @@ -15487,6 +15526,9 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] msgid "Some permissions could not be resolved and are shown as IDs." @@ -15690,6 +15732,10 @@ msgstr "Catégorie de source" msgid "Source location" msgstr "Localisation de la source" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Sparkline" @@ -17596,6 +17642,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -17605,6 +17654,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -19969,12 +20021,12 @@ msgstr "" "Utiliser uniquement les 25 premières valeurs de la dimension s'il en " "existe plus." -msgid "Valid" -msgstr "" - msgid "Valid SQL expression" msgstr "Expression SQL valide" +msgid "Validate against data" +msgstr "" + msgid "Validate query" msgstr "Valider la requête" @@ -19988,6 +20040,9 @@ msgstr "Validation de la connectivité pour %s" msgid "Validating..." msgstr "Validation..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Valeur" diff --git a/superset/translations/it/LC_MESSAGES/messages.po b/superset/translations/it/LC_MESSAGES/messages.po index 3edc7cb01c7e..29a84a2dc191 100644 --- a/superset/translations/it/LC_MESSAGES/messages.po +++ b/superset/translations/it/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2018-02-11 22:26+0200\n" "Last-Translator: Raffaele Spangaro \n" "Language: it\n" @@ -4794,6 +4794,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, # uk, zh, zh_TW] @@ -6081,6 +6086,9 @@ msgstr "Copia con intestazioni" msgid "Corner Radius" msgstr "Raggio d'angolo" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Correlazione" @@ -6860,6 +6868,12 @@ msgstr "Dati aggiornati" msgid "Data type" msgstr "Tipo" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "Seleziona almeno una metrica" @@ -8901,6 +8915,9 @@ msgstr "Inserisci i valori minimo e massimo per il filtro intervallo" msgid "Enter report name" msgstr "Immettere il nome del report" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -9257,6 +9274,12 @@ msgstr "Dataset esistente" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "Esci dalla modalità di modifica" @@ -9475,6 +9498,9 @@ msgstr "Espressione" msgid "Expression cannot be empty" msgstr "L'espressione non può essere vuota" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -12751,6 +12777,10 @@ msgstr "Abbina il colore del timeshift alla serie originale" msgid "Match type" msgstr "Tipo" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] msgid "Matrixify" @@ -14912,6 +14942,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, # uk, zh, zh_TW] @@ -15872,6 +15905,12 @@ msgstr "Classifica" msgid "Ratio" msgstr "Rapporto" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, # uk, zh, zh_TW] @@ -19014,6 +19053,9 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] msgid "Some permissions could not be resolved and are shown as IDs." @@ -19216,6 +19258,10 @@ msgstr "Categoria sorgente" msgid "Source location" msgstr "Posizione sorgente" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, # uk] @@ -21534,6 +21580,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -21543,6 +21592,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -24422,12 +24474,12 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Utilizza i primi 25 valori se la dimensione ne contiene di più." -msgid "Valid" -msgstr "" - msgid "Valid SQL expression" msgstr "Espressione SQL valida" +msgid "Validate against data" +msgstr "" + msgid "Validate query" msgstr "Convalida query" @@ -24443,6 +24495,9 @@ msgstr "Convalida della connettività per %s" msgid "Validating..." msgstr "Convalida..." +msgid "Validation inconclusive" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt, pt_BR, ro, ru, sk, sl, sr, sr_Latn, # tr, uk, zh, zh_TW] diff --git a/superset/translations/ja/LC_MESSAGES/messages.po b/superset/translations/ja/LC_MESSAGES/messages.po index 9e126d247fd4..a2df8fe69363 100644 --- a/superset/translations/ja/LC_MESSAGES/messages.po +++ b/superset/translations/ja/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2024-05-14 13:30+0900\n" "Last-Translator: Yuri Umezaki \n" "Language: ja\n" @@ -3672,6 +3672,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "子ラベルの位置" @@ -4578,6 +4583,9 @@ msgstr "ヘッダー付きでコピー" msgid "Corner Radius" msgstr "角の丸み" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "相関" @@ -5198,6 +5206,12 @@ msgstr "データを更新しました" msgid "Data type" msgstr "データ型" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "データフレームには少なくとも1つの系列が必要です" @@ -6750,6 +6764,9 @@ msgstr "範囲フィルターの最小値と最大値を入力してください msgid "Enter report name" msgstr "レポート名を入力" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7020,6 +7037,12 @@ msgstr "既存のデータセット" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -7205,6 +7228,9 @@ msgstr "式" msgid "Expression cannot be empty" msgstr "式を空にすることはできません" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -9584,6 +9610,10 @@ msgstr "タイムシフト(比較用)の色を元の系列に合わせる" msgid "Match type" msgstr "一致種類" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + msgid "Matrixify" msgstr "マトリックス化" @@ -11197,6 +11227,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -11895,6 +11928,12 @@ msgstr "ランキング" msgid "Ratio" msgstr "比率" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "未加工レコード" @@ -14274,6 +14313,9 @@ msgstr "一部のグループを解決できなかったため、IDとして表 msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + msgid "Some permissions could not be resolved and are shown as IDs." msgstr "一部の権限を解決できなかったため、IDとして表示されています。" @@ -14452,6 +14494,10 @@ msgstr "ソースカテゴリ" msgid "Source location" msgstr "ソースの場所" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "スパークライン" @@ -16090,6 +16136,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -16099,6 +16148,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -18177,12 +18229,12 @@ msgstr "円を用いてシステム内の異なるステージを通るデータ msgid "Uses the first 25 values if the dimension has more." msgstr "ディメンションに値が25件以上ある場合、最初の25件の値を使用します。" -msgid "Valid" -msgstr "" - msgid "Valid SQL expression" msgstr "有効なSQL式" +msgid "Validate against data" +msgstr "" + msgid "Validate query" msgstr "クエリを検証" @@ -18196,6 +18248,9 @@ msgstr "%s の接続を確認中" msgid "Validating..." msgstr "検証中..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "値" diff --git a/superset/translations/ko/LC_MESSAGES/messages.po b/superset/translations/ko/LC_MESSAGES/messages.po index a69e571e24ab..13303c261564 100644 --- a/superset/translations/ko/LC_MESSAGES/messages.po +++ b/superset/translations/ko/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2019-02-02 22:28+0900\n" "Last-Translator: \n" "Language: ko\n" @@ -5582,6 +5582,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, # uk, zh, zh_TW] @@ -7073,6 +7078,9 @@ msgstr "헤더와 함께 복사" msgid "Corner Radius" msgstr "모서리 반경" +msgid "Correct the mapping expression before validating data." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, uk, # zh, zh_TW] @@ -7993,6 +8001,12 @@ msgstr "데이터가 새로고침되었습니다" msgid "Data type" msgstr "차트 유형" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, it, ja, lv, mi, nl, pl, pt, pt_BR, ro, ru, sk, sl, sr, # sr_Latn, tr, uk, zh, zh_TW] @@ -10485,6 +10499,9 @@ msgstr "범위 필터의 최솟값과 최댓값을 입력하세요" msgid "Enter report name" msgstr "차트 유형" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -10911,6 +10928,12 @@ msgstr "차트 수정" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -11198,6 +11221,9 @@ msgstr "표현식" msgid "Expression cannot be empty" msgstr "표현식은 비워둘 수 없습니다" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -15072,6 +15098,10 @@ msgstr "시간 이동 색상을 원본 시리즈와 일치" msgid "Match type" msgstr "차트 유형" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] #, fuzzy @@ -17714,6 +17744,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, # uk, zh, zh_TW] @@ -18940,6 +18973,12 @@ msgstr "순위" msgid "Ratio" msgstr "생성자" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, # uk, zh, zh_TW] @@ -22632,6 +22671,9 @@ msgstr "일부 그룹을 확인할 수 없어 ID로 표시됩니다." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -22939,6 +22981,10 @@ msgstr "데이터소스 명" msgid "Source location" msgstr "데이터소스 명" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, # uk] @@ -25544,6 +25590,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -25553,6 +25602,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -28766,13 +28818,13 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "차원에 더 많은 값이 있으면 처음 25개 값을 사용합니다." -msgid "Valid" -msgstr "" - #, fuzzy msgid "Valid SQL expression" msgstr "표현식" +msgid "Validate against data" +msgstr "" + #, fuzzy msgid "Validate query" msgstr "Query 공유" @@ -28793,6 +28845,9 @@ msgstr "%s에 대한 연결을 확인 중" msgid "Validating..." msgstr "확인 중..." +msgid "Validation inconclusive" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt, pt_BR, ro, ru, sk, sl, sr, sr_Latn, # tr, uk, zh, zh_TW] diff --git a/superset/translations/lv/LC_MESSAGES/messages.po b/superset/translations/lv/LC_MESSAGES/messages.po index fa4cf9a85b87..ef55947cd862 100644 --- a/superset/translations/lv/LC_MESSAGES/messages.po +++ b/superset/translations/lv/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2026-03-27 14:01+0200\n" "Last-Translator: FULL NAME \n" "Language: lv\n" @@ -3989,6 +3989,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Bērna apzīmējuma novietojums" @@ -4956,6 +4961,9 @@ msgstr "Kopēt ar virsrakstiem" msgid "Corner Radius" msgstr "Stūra rādiuss" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Korelācija" @@ -5618,6 +5626,12 @@ msgstr "Dati atsvaidzināti" msgid "Data type" msgstr "Datu tips" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "DataFrame jāiekļauj vismaz viena sērija" @@ -7322,6 +7336,9 @@ msgstr "Ievadiet minimālās un maksimālās vērtības diapazona filtram" msgid "Enter report name" msgstr "Ievadiet atskaites nosaukumu" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7597,6 +7614,12 @@ msgstr "Esoša datu kopa" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -7788,6 +7811,9 @@ msgstr "SQL izteiksme" msgid "Expression cannot be empty" msgstr "Izteiksme nevar būt tukša" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10298,6 +10324,10 @@ msgstr "Saskaņot laika nobīdes krāsu ar sākotnējo sēriju" msgid "Match type" msgstr "Datu tips" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + msgid "Matrixify" msgstr "Iespējot Matrixify" @@ -12020,6 +12050,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -12760,6 +12793,12 @@ msgstr "Ranžēšana" msgid "Ratio" msgstr "Attiecība" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Neapstrādāti ieraksti" @@ -15327,6 +15366,9 @@ msgstr "Dažas grupas nevarēja tikt atrisinātas un tiek rādītas kā ID." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -15526,6 +15568,10 @@ msgstr "Avota kategorija" msgid "Source location" msgstr "Avota kategorija" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Dzirkstlīnija" @@ -17367,6 +17413,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -17376,6 +17425,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -19655,12 +19707,12 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Izmanto pirmās 25 vērtības, ja dimensijai ir vairāk." -msgid "Valid" -msgstr "" - msgid "Valid SQL expression" msgstr "Derīga SQL izteiksme" +msgid "Validate against data" +msgstr "" + msgid "Validate query" msgstr "Pārbaudīt vaicājumu" @@ -19674,6 +19726,9 @@ msgstr "Pārbauda savienojamību priekš %s" msgid "Validating..." msgstr "Pārbaudīšana..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Vērtība" diff --git a/superset/translations/messages.pot b/superset/translations/messages.pot index 18bfc86e7cf3..cd6960d04f15 100644 --- a/superset/translations/messages.pot +++ b/superset/translations/messages.pot @@ -25,7 +25,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -3378,6 +3378,9 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "Checks up to 50 rows per selected partition. Sampling cannot verify every row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "" @@ -4235,6 +4238,9 @@ msgstr "" msgid "Corner Radius" msgstr "" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "" @@ -4810,6 +4816,12 @@ msgstr "" msgid "Data type" msgstr "" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "" @@ -6252,6 +6264,9 @@ msgstr "" msgid "Enter report name" msgstr "" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "Enter the email address of your account and we will send you a link to reset your password." msgstr "" @@ -6517,6 +6532,12 @@ msgstr "" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -6690,6 +6711,9 @@ msgstr "" msgid "Expression cannot be empty" msgstr "" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "Extension '%(extension_id)s' has exceeded its persistent storage quota of %(quota)d bytes." msgstr "" @@ -8922,6 +8946,10 @@ msgstr "" msgid "Match type" msgstr "" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + msgid "Matrixify" msgstr "" @@ -10422,6 +10450,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "Partitions whose height to parent height proportions are below this value are pruned" msgstr "" @@ -11092,6 +11123,9 @@ msgstr "" msgid "Ratio" msgstr "" +msgid "Raw epoch conversion does not specify the partition bucket. Use the expression that populates the partition key, including its hour or day rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "" @@ -13303,6 +13337,9 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + msgid "Some permissions could not be resolved and are shown as IDs." msgstr "" @@ -13469,6 +13506,10 @@ msgstr "" msgid "Source location" msgstr "" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "" @@ -14811,10 +14852,16 @@ msgstr "" msgid "The transform could not read %(value)s written as text, which a filter typed as text sends, so its answer for the timestamp can only be checked by being a date or timestamp within a year of it. It answered %(typed)s, so filters on this mapping will not be mirrored. Write the transform so it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "The transform gives a different partition value for a timestamp (%(typed)s) than for the same instant written as text (%(text)s). A time range and a filter typed as text both reach it, so it cannot be right for both; filters on this mapping will not be mirrored. Write the transform so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "The transform returned %(returned)s for %(column)s, which is %(kind)s. Mirrored filters on this mapping would fail at the database." msgstr "" @@ -16606,10 +16653,10 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "" -msgid "Valid" +msgid "Valid SQL expression" msgstr "" -msgid "Valid SQL expression" +msgid "Validate against data" msgstr "" msgid "Validate query" @@ -16625,6 +16672,9 @@ msgstr "" msgid "Validating..." msgstr "" +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "" diff --git a/superset/translations/mi/LC_MESSAGES/messages.po b/superset/translations/mi/LC_MESSAGES/messages.po index a113ce09269e..9c83a116ef0a 100644 --- a/superset/translations/mi/LC_MESSAGES/messages.po +++ b/superset/translations/mi/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2026-01-25 16:09+1300\n" "Last-Translator: karo.co.nz\n" "Language: mi\n" @@ -4114,6 +4114,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Tūnga tapanga tamaiti" @@ -5134,6 +5139,9 @@ msgstr "Me te pane-iti" msgid "Corner Radius" msgstr "Pūtoro Koki" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Hononga" @@ -5821,6 +5829,12 @@ msgstr "Raraunga kua whakahouhia" msgid "Data type" msgstr "Momo raraunga" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "Me whai te DataFrame i te kotahi raupapa nui rawa" @@ -7608,6 +7622,9 @@ msgstr "Tāuruhia ngā uara iti rawa me ngā uara nui rawa mō te tātari āputa msgid "Enter report name" msgstr "Tāuru ingoa pūrongo" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7900,6 +7917,12 @@ msgstr "Rārangi raraunga kei te tīari" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -8100,6 +8123,9 @@ msgstr "Kīanga SQL" msgid "Expression cannot be empty" msgstr "kāore e taea te noho kau" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10771,6 +10797,10 @@ msgstr "Whakatau tae neke wā ki te raupapa taketake" msgid "Match type" msgstr "Momo raraunga" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] #, fuzzy @@ -12539,6 +12569,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -13319,6 +13352,12 @@ msgstr "Kōmaka" msgid "Ratio" msgstr "Ōwehenga" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Rekoata mata" @@ -16031,6 +16070,9 @@ msgstr "Kāore ētahi rōpū i taea te whakaoti ā ka whakaaturia hei ID." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -16238,6 +16280,10 @@ msgstr "Kāwai puna" msgid "Source location" msgstr "Kāwai puna" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Rārangi Kōhā" @@ -18156,6 +18202,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -18165,6 +18214,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -20596,13 +20648,13 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Ka whakamahi i ngā uara 25 tuatahi mehemea he nui ake ngā uara o te āhua." -msgid "Valid" -msgstr "" - #, fuzzy msgid "Valid SQL expression" msgstr "Kīanga SQL" +msgid "Validate against data" +msgstr "" + #, fuzzy msgid "Validate query" msgstr "Tirohia pātai" @@ -20619,6 +20671,9 @@ msgstr "E manatoko ana i te hononga mō %s" msgid "Validating..." msgstr "E uta ana..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Uara" diff --git a/superset/translations/nl/LC_MESSAGES/messages.po b/superset/translations/nl/LC_MESSAGES/messages.po index 6bfd4b58315d..cb3bcac0e10b 100644 --- a/superset/translations/nl/LC_MESSAGES/messages.po +++ b/superset/translations/nl/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: superset-ds\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2024-05-08 14:41+0000\n" "Last-Translator: \n" "Language: nl\n" @@ -4223,6 +4223,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Onderliggend label positie" @@ -5290,6 +5295,9 @@ msgstr "Met een ondertitel" msgid "Corner Radius" msgstr "Inner Radius" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Correlatie" @@ -6010,6 +6018,12 @@ msgstr "Gegevens verversen" msgid "Data type" msgstr "Data type" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "DataFrame bevat ten minste één reeks" @@ -7855,6 +7869,9 @@ msgstr "Voer minimale en maximale waarden in voor het bereikfilter" msgid "Enter report name" msgstr "Naam rapport" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -8169,6 +8186,12 @@ msgstr "Bestaande dataset" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -8376,6 +8399,9 @@ msgstr "SQL expressie" msgid "Expression cannot be empty" msgstr "mag niet leeg zijn" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -11128,6 +11154,10 @@ msgstr "Kleur van tijdsverschuiving afstemmen op de originele reeks" msgid "Match type" msgstr "Data type" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] #, fuzzy @@ -12960,6 +12990,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -13764,6 +13797,12 @@ msgstr "Ranglijst" msgid "Ratio" msgstr "Verhouding" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Ruwe records" @@ -16538,6 +16577,9 @@ msgstr "Sommige groepen konden niet worden omgezet en worden weergegeven als ID' msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -16749,6 +16791,10 @@ msgstr "Bron categorie" msgid "Source location" msgstr "Bron categorie" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Sparkline" @@ -18770,6 +18816,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -18779,6 +18828,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -21269,13 +21321,13 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Gebruikt de eerste 25 waarden als de dimensie er meer heeft." -msgid "Valid" -msgstr "" - #, fuzzy msgid "Valid SQL expression" msgstr "SQL expressie" +msgid "Validate against data" +msgstr "" + #, fuzzy msgid "Validate query" msgstr "Bekijk zoekopdracht" @@ -21294,6 +21346,9 @@ msgstr "Connectiviteit valideren voor %s" msgid "Validating..." msgstr "Bezig met laden…" +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Waarde" diff --git a/superset/translations/pl/LC_MESSAGES/messages.po b/superset/translations/pl/LC_MESSAGES/messages.po index 97a97431c821..3a1adca991b8 100644 --- a/superset/translations/pl/LC_MESSAGES/messages.po +++ b/superset/translations/pl/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2021-11-16 17:33+0100\n" "Last-Translator: FULL NAME \n" "Language: pl\n" @@ -4236,6 +4236,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Pozycja etykiety podrzędnej" @@ -5333,6 +5338,9 @@ msgstr "Z podtytułem" msgid "Corner Radius" msgstr "Promień wewnętrzny" +msgid "Correct the mapping expression before validating data." +msgstr "" + #, fuzzy msgid "Correlation" msgstr "Korelacja" @@ -6082,6 +6090,12 @@ msgstr "Dane odświeżone" msgid "Data type" msgstr "Typ danych" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "DataFrame musi zawierać co najmniej jedną serię" @@ -7968,6 +7982,9 @@ msgstr "Wprowadź wartości minimalne i maksymalne dla filtru zakresu" msgid "Enter report name" msgstr "Wprowadź nazwę raportu" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -8288,6 +8305,12 @@ msgstr "Brakujący zestaw danych" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -8496,6 +8519,9 @@ msgstr "Wyrażenie SQL" msgid "Expression cannot be empty" msgstr "nie może być puste" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -11279,6 +11305,10 @@ msgstr "Dopasuj kolor przesunięcia czasowego do oryginalnej serii" msgid "Match type" msgstr "Typ danych" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] #, fuzzy @@ -13128,6 +13158,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -13967,6 +14000,12 @@ msgstr "Ranking" msgid "Ratio" msgstr "Stosunek" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Surowe dane" @@ -16831,6 +16870,9 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -17053,6 +17095,10 @@ msgstr "Kategoria źródłowa" msgid "Source location" msgstr "Kategoria źródłowa" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Wykres liniowy (Sparkline)" @@ -19068,6 +19114,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -19077,6 +19126,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -21614,13 +21666,13 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Używa pierwszych 25 wartości, jeśli wymiar zawiera ich więcej." -msgid "Valid" -msgstr "" - #, fuzzy msgid "Valid SQL expression" msgstr "Wyrażenie SQL" +msgid "Validate against data" +msgstr "" + #, fuzzy msgid "Validate query" msgstr "Zobacz zapytanie" @@ -21639,6 +21691,9 @@ msgstr "Sprawdzanie połączenia dla %s" msgid "Validating..." msgstr "Ładowanie..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Wartość" diff --git a/superset/translations/pt/LC_MESSAGES/messages.po b/superset/translations/pt/LC_MESSAGES/messages.po index c2fa0ab118da..c7b66832eaab 100644 --- a/superset/translations/pt/LC_MESSAGES/messages.po +++ b/superset/translations/pt/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2026-07-17 14:21+0000\n" "Last-Translator: José Teixeira \n" "Language: pt\n" @@ -5013,6 +5013,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, # uk, zh, zh_TW] @@ -6268,6 +6273,9 @@ msgstr "Copiar com cabeçalhos" msgid "Corner Radius" msgstr "Raio de canto" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Correlação" @@ -7073,6 +7081,12 @@ msgstr "Dados atualizados" msgid "Data type" msgstr "Tipo de dado" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "DataFrame inclui pelo menos uma série" @@ -9248,6 +9262,9 @@ msgstr "Digite os valores mínimo e máximo para o filtro de intervalo" msgid "Enter report name" msgstr "Insira o nome do relatório" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -9609,6 +9626,12 @@ msgstr "Conjunto de dados existente" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -9837,6 +9860,9 @@ msgstr "Expressão" msgid "Expression cannot be empty" msgstr "A expressão não pode ficar vazia" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -13142,6 +13168,10 @@ msgstr "Combinar a cor do deslocamento de tempo com a série original" msgid "Match type" msgstr "Tipo de correspondência" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] msgid "Matrixify" @@ -15413,6 +15443,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, # uk, zh, zh_TW] @@ -16444,6 +16477,12 @@ msgstr "Classificação" msgid "Ratio" msgstr "Proporção" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, # uk, zh, zh_TW] @@ -19643,6 +19682,9 @@ msgstr "Alguns grupos não puderam ser resolvidos e são mostrados como IDs." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] msgid "Some permissions could not be resolved and are shown as IDs." @@ -19871,6 +19913,10 @@ msgstr "Categoria de origem" msgid "Source location" msgstr "Local de origem" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, # uk] @@ -22260,6 +22306,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -22269,6 +22318,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -25149,12 +25201,12 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Usa os primeiros 25 valores se a dimensão tiver mais." -msgid "Valid" -msgstr "" - msgid "Valid SQL expression" msgstr "Expressão SQL válida" +msgid "Validate against data" +msgstr "" + msgid "Validate query" msgstr "Validar consulta" @@ -25172,6 +25224,9 @@ msgstr "Validando a conectividade para%s" msgid "Validating..." msgstr "Validando..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Valor" diff --git a/superset/translations/pt_BR/LC_MESSAGES/messages.po b/superset/translations/pt_BR/LC_MESSAGES/messages.po index f6b4bd46f628..f275e980da7a 100644 --- a/superset/translations/pt_BR/LC_MESSAGES/messages.po +++ b/superset/translations/pt_BR/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2023-05-22 08:04-0400\n" "Last-Translator: \n" "Language: pt_BR\n" @@ -4210,6 +4210,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Posição do rótulo filho" @@ -5272,6 +5277,9 @@ msgstr "Copiar com cabeçalhos" msgid "Corner Radius" msgstr "Raio de canto" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Correlação" @@ -6024,6 +6032,12 @@ msgstr "Dados atualizados" msgid "Data type" msgstr "Tipo de dado" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "DataFrame inclui pelo menos uma série" @@ -7862,6 +7876,9 @@ msgstr "Digite os valores mínimo e máximo para o filtro de intervalo" msgid "Enter report name" msgstr "Insira o nome do relatório" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -8170,6 +8187,12 @@ msgstr "Conjunto de dados existente" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -8384,6 +8407,9 @@ msgstr "Expressão" msgid "Expression cannot be empty" msgstr "A expressão não pode ficar vazia" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -11196,6 +11222,10 @@ msgstr "Combinar a cor do deslocamento de tempo com a série original" msgid "Match type" msgstr "Tipo de correspondência" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] #, fuzzy @@ -13038,6 +13068,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -13872,6 +13905,12 @@ msgstr "Classificação" msgid "Ratio" msgstr "Proporção" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Registros Brutos" @@ -16676,6 +16715,9 @@ msgstr "Alguns grupos não puderam ser resolvidos e são mostrados como IDs." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -16889,6 +16931,10 @@ msgstr "Categoria de origem" msgid "Source location" msgstr "Local de origem" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Minigráfico" @@ -18898,6 +18944,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -18907,6 +18956,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -21389,13 +21441,13 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Usa os primeiros 25 valores se a dimensão tiver mais." -msgid "Valid" -msgstr "" - #, fuzzy msgid "Valid SQL expression" msgstr "Expressão SQL válida" +msgid "Validate against data" +msgstr "" + #, fuzzy msgid "Validate query" msgstr "Validar consulta" @@ -21414,6 +21466,9 @@ msgstr "Validando a conectividade para%s" msgid "Validating..." msgstr "Validando..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Valor" diff --git a/superset/translations/ro/LC_MESSAGES/messages.po b/superset/translations/ro/LC_MESSAGES/messages.po index 66a3f558d79f..28578218edc2 100644 --- a/superset/translations/ro/LC_MESSAGES/messages.po +++ b/superset/translations/ro/LC_MESSAGES/messages.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: ro\n" @@ -4206,6 +4206,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Poziție etichetă copil" @@ -5234,6 +5239,9 @@ msgstr "Copiază cu Antete" msgid "Corner Radius" msgstr "Rază Colț" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Corelație" @@ -5948,6 +5956,12 @@ msgstr "Date reîmprospătate" msgid "Data type" msgstr "Tip date" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "DataFrame-ul trebuie să includă cel puțin o serie" @@ -7791,6 +7805,9 @@ msgstr "Introduceți valorile minime și maxime pentru filtrul de interval" msgid "Enter report name" msgstr "Introduceți numele raportului" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -8078,6 +8095,12 @@ msgstr "Set de date existent" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -8283,6 +8306,9 @@ msgstr "Expresie" msgid "Expression cannot be empty" msgstr "Expresia nu poate fi goală" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10974,6 +11000,10 @@ msgstr "Potrivește culoarea deplasării de timp cu seria originală" msgid "Match type" msgstr "Tip de potrivire" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + msgid "Matrixify" msgstr "Matrixify" @@ -12773,6 +12803,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -13549,6 +13582,12 @@ msgstr "Clasament" msgid "Ratio" msgstr "Raport" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Înregistrări brute" @@ -16293,6 +16332,9 @@ msgstr "Unele grupuri nu au putut fi rezolvate și sunt afișate ca ID-uri." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, ja, sr, # sr_Latn] #, fuzzy @@ -16499,6 +16541,10 @@ msgstr "Categorie sursă" msgid "Source location" msgstr "Locație sursă" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Sparkline" @@ -18447,6 +18493,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -18456,6 +18505,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -20901,12 +20953,12 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Folosește primele 25 de valori dacă dimensiunea conține mai multe." -msgid "Valid" -msgstr "" - msgid "Valid SQL expression" msgstr "Expresie SQL validă" +msgid "Validate against data" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, it, ja, # lv, ru, sr, sr_Latn, uk] #, fuzzy @@ -20923,6 +20975,9 @@ msgstr "Validare conectivitate pentru %s" msgid "Validating..." msgstr "Validare..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Valoare" diff --git a/superset/translations/ru/LC_MESSAGES/messages.po b/superset/translations/ru/LC_MESSAGES/messages.po index 6546b3341aa6..0b931ec7c51a 100644 --- a/superset/translations/ru/LC_MESSAGES/messages.po +++ b/superset/translations/ru/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2026-07-17 09:44+0100\n" "Last-Translator: Daniel Checheta\n" "Language: ru\n" @@ -3933,6 +3933,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Расположение меток листьев" @@ -4888,6 +4893,9 @@ msgstr "Копировать с заголовком" msgid "Corner Radius" msgstr "Радиус скругления" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Корреляция" @@ -5531,6 +5539,12 @@ msgstr "Данные обновлены" msgid "Data type" msgstr "Тип данных" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "Датафрейм должен включать хотя бы один ряд" @@ -7214,6 +7228,9 @@ msgstr "Введите минимальное и максимальное зна msgid "Enter report name" msgstr "Введите имя отчета" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7486,6 +7503,12 @@ msgstr "Существующий датасет" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -7674,6 +7697,9 @@ msgstr "Выражение SQL" msgid "Expression cannot be empty" msgstr "Выражение не может быть пустым" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10147,6 +10173,10 @@ msgstr "Синхронизировать цвет временного сдви msgid "Match type" msgstr "Тип данных" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + msgid "Matrixify" msgstr "Матричное расположение" @@ -11854,6 +11884,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -12577,6 +12610,12 @@ msgstr "Ранжирование" msgid "Ratio" msgstr "Отношение" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Сырые записи" @@ -15060,6 +15099,9 @@ msgstr "Некоторые группы не удалось найти, поэт msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] msgid "Some permissions could not be resolved and are shown as IDs." @@ -15251,6 +15293,10 @@ msgstr "Исходная категория" msgid "Source location" msgstr "Исходная категория" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Спарклайн" @@ -17071,6 +17117,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -17080,6 +17129,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -19331,12 +19383,12 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Использует первые 25 значений, если измерение содержит больше." -msgid "Valid" -msgstr "" - msgid "Valid SQL expression" msgstr "Корректное SQL-выражение" +msgid "Validate against data" +msgstr "" + msgid "Validate query" msgstr "Проверить запрос" @@ -19350,6 +19402,9 @@ msgstr "Проверка подключения для %s" msgid "Validating..." msgstr "Проверка..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Значение" diff --git a/superset/translations/sk/LC_MESSAGES/messages.po b/superset/translations/sk/LC_MESSAGES/messages.po index f14c36e27fe9..b5f09dc0fefe 100644 --- a/superset/translations/sk/LC_MESSAGES/messages.po +++ b/superset/translations/sk/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2026-05-18 15:42+0200\n" "Last-Translator: FULL NAME \n" "Language: sk\n" @@ -4027,6 +4027,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Pozícia popisku podriadenej položky" @@ -5011,6 +5016,9 @@ msgstr "Kopírovať s hlavičkami" msgid "Corner Radius" msgstr "Polomer rohu" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Korelácie" @@ -5682,6 +5690,12 @@ msgstr "Data obnovena" msgid "Data type" msgstr "Datový typ" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "Datový rámec musí obsahovať alespoň jednu sérii" @@ -7444,6 +7458,9 @@ msgstr "Zadejte minimální a maximální hodnoty pre filter rozsahu" msgid "Enter report name" msgstr "Zadejte názov reportu" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7729,6 +7746,12 @@ msgstr "Existujúcí sada dat" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -7930,6 +7953,9 @@ msgstr "SQL výraz" msgid "Expression cannot be empty" msgstr "Výraz nesmí být prázdny" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10494,6 +10520,10 @@ msgstr "Sladit farbu časového posunu s pôvodný sérií" msgid "Match type" msgstr "Datový typ" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + msgid "Matrixify" msgstr "Matrixify" @@ -12243,6 +12273,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -12999,6 +13032,12 @@ msgstr "Pořadí" msgid "Ratio" msgstr "Pomer" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Nezpracované záznamy" @@ -15621,6 +15660,9 @@ msgstr "Niektoré skupiny sa nepodarilo vyriešiť a sú zobrazené ako ID." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -15824,6 +15866,10 @@ msgstr "Zdrojová kategória" msgid "Source location" msgstr "Zdrojová kategória" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Minigraf" @@ -17678,6 +17724,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -17687,6 +17736,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -20023,13 +20075,13 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Použije prvých 25 hodnôt, ak dimenzia obsahuje viac." -msgid "Valid" -msgstr "" - #, fuzzy msgid "Valid SQL expression" msgstr "Platný SQL výraz" +msgid "Validate against data" +msgstr "" + #, fuzzy msgid "Validate query" msgstr "Overiť dotaz" @@ -20046,6 +20098,9 @@ msgstr "Oveřuje sa konektivita pre %s" msgid "Validating..." msgstr "Oveřovanie..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Hodnota" diff --git a/superset/translations/sl/LC_MESSAGES/messages.po b/superset/translations/sl/LC_MESSAGES/messages.po index 2317f2b34462..233cded751e6 100644 --- a/superset/translations/sl/LC_MESSAGES/messages.po +++ b/superset/translations/sl/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset\n" "Report-Msgid-Bugs-To: dkrat7 @github.com\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2026-07-29 16:16+0200\n" "Last-Translator: lapor-kris \n" "Language: sl_SI\n" @@ -4046,6 +4046,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Položaj podrejene oznake" @@ -5024,6 +5029,9 @@ msgstr "Kopiraj z glavami" msgid "Corner Radius" msgstr "Radij kota" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Korelacija" @@ -5689,6 +5697,12 @@ msgstr "Podatki osveženi" msgid "Data type" msgstr "Tip podatka" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "DataFrame vsebuje vsaj eno serijo" @@ -7422,6 +7436,9 @@ msgstr "Vnesite najmanjšo in največjo vrednost za filter obsega" msgid "Enter report name" msgstr "Vnesite naslov poročila" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7706,6 +7723,12 @@ msgstr "Obstoječ podatkovni set" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -7899,6 +7922,9 @@ msgstr "Izraz" msgid "Expression cannot be empty" msgstr "Izraz ne sme biti prazen" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10439,6 +10465,10 @@ msgstr "Uskladi barvo časovnega premika z izvorno serijo" msgid "Match type" msgstr "Vrsta ujemanja" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] msgid "Matrixify" @@ -12170,6 +12200,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -12918,6 +12951,12 @@ msgstr "Rangiranje" msgid "Ratio" msgstr "Razmerje" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Surovi podatki" @@ -15499,6 +15538,9 @@ msgstr "Nekaterih skupin ni bilo mogoče razrešiti in so prikazane kot ID-ji." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] msgid "Some permissions could not be resolved and are shown as IDs." @@ -15692,6 +15734,10 @@ msgstr "Kategorija izvora" msgid "Source location" msgstr "Lokacija vira" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Hitri grafikon" @@ -17549,6 +17595,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -17558,6 +17607,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -19873,12 +19925,12 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Uporabi prvih 25 vrednosti, če jih ima dimenzija več." -msgid "Valid" -msgstr "" - msgid "Valid SQL expression" msgstr "Veljaven izraz SQL" +msgid "Validate against data" +msgstr "" + msgid "Validate query" msgstr "Preveri poizvedbo" @@ -19896,6 +19948,9 @@ msgstr "Preverjanje povezljivosti za %s" msgid "Validating..." msgstr "Preverjanje ..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Vrednost" diff --git a/superset/translations/sr/LC_MESSAGES/messages.po b/superset/translations/sr/LC_MESSAGES/messages.po index e167ba901608..6889f391c7ea 100644 --- a/superset/translations/sr/LC_MESSAGES/messages.po +++ b/superset/translations/sr/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2026-06-14 13:20+0200\n" "Last-Translator: FULL NAME \n" "Language: sr\n" @@ -4745,6 +4745,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk, zh, zh_TW] msgid "Child label position" msgstr "Позиција подређене ознаке" @@ -5916,6 +5921,9 @@ msgstr "Копирај са заглављима" msgid "Corner Radius" msgstr "Радијус угла" +msgid "Correct the mapping expression before validating data." +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pt_BR, ru, sk, sl, uk, zh, zh_TW] msgid "Correlation" msgstr "Корелација" @@ -6717,6 +6725,12 @@ msgstr "Подаци ажурирани" msgid "Data type" msgstr "Тип података" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + # de, es, fa, fr, it, ja, lv, mi, nl, pl, pt, pt_BR, ru, sk, sl, uk, zh, # zh_TW] msgid "DataFrame include at least one series" @@ -8822,6 +8836,9 @@ msgstr "Унесите минималну и максималну вреднос msgid "Enter report name" msgstr "Унесите назив извештаја" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -9164,6 +9181,12 @@ msgstr "Постојећи скуп података" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -9391,6 +9414,9 @@ msgstr "Израз" msgid "Expression cannot be empty" msgstr "Израз не може бити празан" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -12391,6 +12417,10 @@ msgstr "Усклади боју временског помака са ориг msgid "Match type" msgstr "Тип подударања" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # lv, ru, sk, uk] msgid "Matrixify" msgstr "Matrixify" @@ -14468,6 +14498,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk, zh, zh_TW] msgid "" "Partitions whose height to parent height proportions are below this value" @@ -15383,6 +15416,12 @@ msgstr "Рангирање" msgid "Ratio" msgstr "Однос" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk, zh, zh_TW] msgid "Raw records" msgstr "Сирови записи" @@ -18423,6 +18462,9 @@ msgstr "Неке групе нису могле бити разрешене и msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + msgid "Some permissions could not be resolved and are shown as IDs." msgstr "Неке дозволе нису могле бити разрешене и приказане су као ИД-ови." @@ -18657,6 +18699,10 @@ msgstr "Категорија извора" msgid "Source location" msgstr "Локација извора" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk] msgid "Sparkline" msgstr "Спарклајн" @@ -20791,6 +20837,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -20800,6 +20849,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -23432,13 +23484,13 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Користи првих 25 вредности ако димензија садржи више." -msgid "Valid" -msgstr "" - # uk] msgid "Valid SQL expression" msgstr "Важећи SQL израз" +msgid "Validate against data" +msgstr "" + # uk] msgid "Validate query" msgstr "Провери упит" @@ -23456,6 +23508,9 @@ msgstr "Провера повезивости за %s" msgid "Validating..." msgstr "Провера у току..." +msgid "Validation inconclusive" +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pl, pt, pt_BR, ru, sk, sl, tr, uk, zh, # zh_TW] msgid "Value" diff --git a/superset/translations/sr_Latn/LC_MESSAGES/messages.po b/superset/translations/sr_Latn/LC_MESSAGES/messages.po index a39beb01e73c..35e161b23980 100644 --- a/superset/translations/sr_Latn/LC_MESSAGES/messages.po +++ b/superset/translations/sr_Latn/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2026-06-14 13:20+0200\n" "Last-Translator: FULL NAME \n" "Language: sr_Latn\n" @@ -4748,6 +4748,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk, zh, zh_TW] msgid "Child label position" msgstr "Pozicija podređene oznake" @@ -5919,6 +5924,9 @@ msgstr "Kopiraj sa zaglavljima" msgid "Corner Radius" msgstr "Radijus ugla" +msgid "Correct the mapping expression before validating data." +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pt_BR, ru, sk, sl, uk, zh, zh_TW] msgid "Correlation" msgstr "Korelacija" @@ -6720,6 +6728,12 @@ msgstr "Podaci ažurirani" msgid "Data type" msgstr "Tip podataka" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + # de, es, fa, fr, it, ja, lv, mi, nl, pl, pt, pt_BR, ru, sk, sl, uk, zh, # zh_TW] msgid "DataFrame include at least one series" @@ -8826,6 +8840,9 @@ msgstr "Unesite minimalnu i maksimalnu vrednost za filter opsega" msgid "Enter report name" msgstr "Unesite naziv izveštaja" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -9168,6 +9185,12 @@ msgstr "Postojeći skup podataka" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -9395,6 +9418,9 @@ msgstr "Izraz" msgid "Expression cannot be empty" msgstr "Izraz ne može biti prazan" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -12398,6 +12424,10 @@ msgstr "Uskladi boju vremenskog pomaka sa originalnom serijom" msgid "Match type" msgstr "Tip podudaranja" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # lv, ru, sk, uk] msgid "Matrixify" msgstr "Matrixify" @@ -14475,6 +14505,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk, zh, zh_TW] msgid "" "Partitions whose height to parent height proportions are below this value" @@ -15390,6 +15423,12 @@ msgstr "Rangiranje" msgid "Ratio" msgstr "Odnos" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk, zh, zh_TW] msgid "Raw records" msgstr "Sirovi zapisi" @@ -18430,6 +18469,9 @@ msgstr "Neke grupe nisu mogle biti razrešene i prikazane su kao ID-ovi." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + msgid "Some permissions could not be resolved and are shown as IDs." msgstr "Neke dozvole nisu mogle biti razrešene i prikazane su kao ID-ovi." @@ -18664,6 +18706,10 @@ msgstr "Kategorija izvora" msgid "Source location" msgstr "Lokacija izvora" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk] msgid "Sparkline" msgstr "Sparklajn" @@ -20799,6 +20845,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -20808,6 +20857,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -23449,13 +23501,13 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Koristi prvih 25 vrednosti ako dimenzija sadrži više." -msgid "Valid" -msgstr "" - # uk] msgid "Valid SQL expression" msgstr "Važeći SQL izraz" +msgid "Validate against data" +msgstr "" + # uk] msgid "Validate query" msgstr "Proveri upit" @@ -23473,6 +23525,9 @@ msgstr "Provera povezivosti za %s" msgid "Validating..." msgstr "Provera u toku..." +msgid "Validation inconclusive" +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pl, pt, pt_BR, ru, sk, sl, tr, uk, zh, # zh_TW] msgid "Value" diff --git a/superset/translations/ta/LC_MESSAGES/messages.po b/superset/translations/ta/LC_MESSAGES/messages.po index 17b7b0f1a6aa..01b6b7bc2d30 100644 --- a/superset/translations/ta/LC_MESSAGES/messages.po +++ b/superset/translations/ta/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2026-03-31 02:00-0700\n" "Last-Translator: Maazin Ahamed\n" "Language: ta\n" @@ -3943,6 +3943,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "துணைக் குறிச்சொல் (Child label) நிலை" @@ -4918,6 +4923,9 @@ msgstr "தலைப்புகளுடன் நகலெடு" msgid "Corner Radius" msgstr "மூலை ஆரம் (Corner Radius)" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "ஒட்டுறவு (Correlation)" @@ -5570,6 +5578,12 @@ msgstr "தரவு புதுப்பிக்கப்பட்டது" msgid "Data type" msgstr "தரவு வகை" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "டேட்டாஃபிரேமில் குறைந்தபட்சம் ஒரு வரிசை இருக்க வேண்டும்" @@ -7251,6 +7265,9 @@ msgstr "" msgid "Enter report name" msgstr "அறிக்கை பெயரை உள்ளிடவும்" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7525,6 +7542,12 @@ msgstr "ஏற்கனவே உள்ள தரவுத்தொகுப் msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -7716,6 +7739,9 @@ msgstr "SQL கோவை (expression)" msgid "Expression cannot be empty" msgstr "கோவை (Expression) காலியாக இருக்கக்கூடாது" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10176,6 +10202,10 @@ msgstr "நேர மாற்ற நிறத்தை அசல் தொட msgid "Match type" msgstr "தரவு வகை" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + msgid "Matrixify" msgstr "மேட்ரிசிஃபை (Matrixify)" @@ -11818,6 +11848,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -12542,6 +12575,12 @@ msgstr "தரவரிசை (Ranking)" msgid "Ratio" msgstr "விகிதம் (Ratio)" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "மூலப் பதிவுகள் (Raw records)" @@ -15014,6 +15053,9 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + msgid "Some permissions could not be resolved and are shown as IDs." msgstr "" @@ -15206,6 +15248,10 @@ msgstr "மூல வகை" msgid "Source location" msgstr "மூல வகை" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "ஸ்பார்க்லைன்" @@ -16912,6 +16958,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -16921,6 +16970,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -19097,12 +19149,12 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "" -msgid "Valid" -msgstr "" - msgid "Valid SQL expression" msgstr "சரியான SQL வெளிப்பாடு" +msgid "Validate against data" +msgstr "" + msgid "Validate query" msgstr "வினவலைச் சரிபார்க்கவும்" @@ -19116,6 +19168,9 @@ msgstr "%s க்கான இணைப்பைச் சரிபார்க msgid "Validating..." msgstr "சரிபார்க்கிறது..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "மதிப்பு" diff --git a/superset/translations/th/LC_MESSAGES/messages.po b/superset/translations/th/LC_MESSAGES/messages.po index cb12ef399d4e..8ece3b148c3f 100644 --- a/superset/translations/th/LC_MESSAGES/messages.po +++ b/superset/translations/th/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: th\n" @@ -6121,6 +6121,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk, zh, zh_TW] #, fuzzy @@ -7722,6 +7727,9 @@ msgstr "คัดลอกพร้อมส่วนหัว" msgid "Corner Radius" msgstr "รัศมีมุม" +msgid "Correct the mapping expression before validating data." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pt_BR, ru, sk, sl, uk, zh, zh_TW] #, fuzzy @@ -8808,6 +8816,12 @@ msgstr "รีเฟรชข้อมูลแล้ว" msgid "Data type" msgstr "ประเภทข้อมูล" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, it, ja, lv, mi, nl, pl, pt, pt_BR, ru, sk, sl, uk, zh, # zh_TW] @@ -11631,6 +11645,9 @@ msgstr "ป้อนค่าต่ำสุดและสูงสุดสำ msgid "Enter report name" msgstr "ป้อนชื่อรายงาน" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -12099,6 +12116,12 @@ msgstr "ชุดข้อมูลที่มีอยู่" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -12407,6 +12430,9 @@ msgstr "นิพจน์ SQL" msgid "Expression cannot be empty" msgstr "นิพจน์ไม่สามารถว่างเปล่าได้" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -16547,6 +16573,10 @@ msgstr "จับคู่สีการเลื่อนเวลากับ msgid "Match type" msgstr "ประเภทข้อมูล" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, fr, ja, # lv, ru, sk, uk] #, fuzzy @@ -19356,6 +19386,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk, zh, zh_TW] #, fuzzy @@ -20655,6 +20688,12 @@ msgstr "การจัดอันดับ" msgid "Ratio" msgstr "อัตราส่วน" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk, zh, zh_TW] #, fuzzy @@ -24817,6 +24856,9 @@ msgstr "บางกลุ่มไม่สามารถระบุได้ msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -25144,6 +25186,10 @@ msgstr "หมวดหมู่ต้นทาง" msgid "Source location" msgstr "หมวดหมู่ต้นทาง" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt_BR, ru, sk, sl, uk] #, fuzzy @@ -27872,6 +27918,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -27881,6 +27930,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -31271,15 +31323,15 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "ใช้ค่า 25 ค่าแรกหากมิติมีค่ามากกว่านั้น" -msgid "Valid" -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ja, lv, ru, # uk] #, fuzzy msgid "Valid SQL expression" msgstr "นิพจน์ SQL ที่ถูกต้อง" +msgid "Validate against data" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ja, lv, ru, # uk] #, fuzzy @@ -31304,6 +31356,9 @@ msgstr "กำลังตรวจสอบการเชื่อมต่อ msgid "Validating..." msgstr "กำลังตรวจสอบ..." +msgid "Validation inconclusive" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pl, pt, pt_BR, ru, sk, sl, tr, uk, zh, # zh_TW] diff --git a/superset/translations/tr/LC_MESSAGES/messages.po b/superset/translations/tr/LC_MESSAGES/messages.po index de9a111b3da0..4300f4710793 100644 --- a/superset/translations/tr/LC_MESSAGES/messages.po +++ b/superset/translations/tr/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: avsarcoteli@gmail.com\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2024-02-25 14:00+0300\n" "Last-Translator: FULL NAME \n" "Language: tr\n" @@ -4015,6 +4015,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Çocuk etiketi pozisyonu" @@ -4999,6 +5004,9 @@ msgstr "Headers ile kopyalayın" msgid "Corner Radius" msgstr "Corner Radius" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Correlation" @@ -5682,6 +5690,12 @@ msgstr "Veri yenilendi" msgid "Data type" msgstr "Veri tipi" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "DataFrame en az bir seri içerir" @@ -7392,6 +7406,9 @@ msgstr "aralığı filtre için minimum ve maksimum değerler girin" msgid "Enter report name" msgstr "Rapor adını girin" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7673,6 +7690,12 @@ msgstr "Mevcut veri kümesi" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -7869,6 +7892,9 @@ msgstr "İfade" msgid "Expression cannot be empty" msgstr "İfade boş olamaz" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10432,6 +10458,10 @@ msgstr "Maç zamanı orijinal seri ile renk değiştiriyor" msgid "Match type" msgstr "Eşleşme türü" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + msgid "Matrixify" msgstr "Matrixify" @@ -12182,6 +12212,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -12934,6 +12967,12 @@ msgstr "Sıralama" msgid "Ratio" msgstr "Oran" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Raw kayıtları" @@ -15628,6 +15667,9 @@ msgstr "Bazı gruplar çözümlenemedi ve ID olarak gösteriliyor." msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -15834,6 +15876,10 @@ msgstr "Source kategori" msgid "Source location" msgstr "Kaynak konumu" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Spark" @@ -17715,6 +17761,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -17724,6 +17773,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -20100,12 +20152,12 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Boyutun daha fazla değeri varsa ilk 25 değeri kullanır." -msgid "Valid" -msgstr "" - msgid "Valid SQL expression" msgstr "Geçerli SQL ifadesi" +msgid "Validate against data" +msgstr "" + #, fuzzy msgid "Validate query" msgstr "Sorguyu gör" @@ -20121,6 +20173,9 @@ msgstr "%s " msgid "Validating..." msgstr "Yükleniyor…" +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Değer" diff --git a/superset/translations/uk/LC_MESSAGES/messages.po b/superset/translations/uk/LC_MESSAGES/messages.po index bcbc57f182d8..983fbbbc534d 100644 --- a/superset/translations/uk/LC_MESSAGES/messages.po +++ b/superset/translations/uk/LC_MESSAGES/messages.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: ted.korostiled@gmail.com\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2026-04-30 22:04+0300\n" "Last-Translator: Danylo Korostil\n" "Language: uk\n" @@ -3999,6 +3999,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "Позиція дочірньої мітки" @@ -4965,6 +4970,9 @@ msgstr "Скопіювати із заголовком" msgid "Corner Radius" msgstr "Заокруглення кутів" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "Кореляція" @@ -5625,6 +5633,12 @@ msgstr "Дані оновлено" msgid "Data type" msgstr "Тип даних" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "Таблиця даних має містити щонайменше один ряд даних" @@ -7340,6 +7354,9 @@ msgstr "Введіть мінімальне та максимальне знач msgid "Enter report name" msgstr "Введіть назву доповіді" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7615,6 +7632,12 @@ msgstr "Наявний набір даних" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -7806,6 +7829,9 @@ msgstr "Вираз SQL" msgid "Expression cannot be empty" msgstr "Вираз не може бути порожній" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10308,6 +10334,10 @@ msgstr "Зіставити колір зсуву часу з основними msgid "Match type" msgstr "Тип даних" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + msgid "Matrixify" msgstr "Матриця" @@ -12023,6 +12053,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -12762,6 +12795,12 @@ msgstr "Ранжування" msgid "Ratio" msgstr "Відношення сторін" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "Сирі записи" @@ -15338,6 +15377,9 @@ msgstr "Деякі групи не вдалося розпізнати і вон msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -15537,6 +15579,10 @@ msgstr "Початкова категорія" msgid "Source location" msgstr "Початкова категорія" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "Нитка" @@ -17375,6 +17421,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -17384,6 +17433,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -19663,12 +19715,12 @@ msgstr "" msgid "Uses the first 25 values if the dimension has more." msgstr "Використовує перші 25 значень, якщо вимір містить більше." -msgid "Valid" -msgstr "" - msgid "Valid SQL expression" msgstr "Правильний SQL" +msgid "Validate against data" +msgstr "" + msgid "Validate query" msgstr "Перевірити запит" @@ -19682,6 +19734,9 @@ msgstr "Перевіряємо з’єднання для %s" msgid "Validating..." msgstr "Перевіряння..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "Значення" diff --git a/superset/translations/zh/LC_MESSAGES/messages.po b/superset/translations/zh/LC_MESSAGES/messages.po index 690c9b0d4e9c..083440f24390 100644 --- a/superset/translations/zh/LC_MESSAGES/messages.po +++ b/superset/translations/zh/LC_MESSAGES/messages.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: Apache Superset 0.22.1\n" "Report-Msgid-Bugs-To: zhouyao94@qq.com\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2019-01-04 22:19+0800\n" "Last-Translator: cdmikechen\n" "Language: zh\n" @@ -4036,6 +4036,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "子标签位置" @@ -5036,6 +5041,9 @@ msgstr "复制并包含标题" msgid "Corner Radius" msgstr "圆角半径" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "相关性" @@ -5734,6 +5742,12 @@ msgstr "已刷新数据" msgid "Data type" msgstr "数据类型" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "数据帧(DataFrame)至少包括一个序列" @@ -7440,6 +7454,9 @@ msgstr "输入范围过滤器的最小值和最大值" msgid "Enter report name" msgstr "输入报告名称" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -7735,6 +7752,12 @@ msgstr "现有数据集" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "退出编辑模式" @@ -7936,6 +7959,9 @@ msgstr "表达式" msgid "Expression cannot be empty" msgstr "表达式不能为空" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -10597,6 +10623,10 @@ msgstr "匹配时间偏移颜色与原始系列" msgid "Match type" msgstr "匹配类型" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] msgid "Matrixify" @@ -12387,6 +12417,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -13183,6 +13216,12 @@ msgstr "排名" msgid "Ratio" msgstr "比率" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "原始记录" @@ -15783,6 +15822,9 @@ msgstr "某些组无法解析,已显示为ID。" msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] msgid "Some permissions could not be resolved and are shown as IDs." @@ -15975,6 +16017,10 @@ msgstr "源分类" msgid "Source location" msgstr "源位置" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + msgid "Sparkline" msgstr "迷你趋势图" @@ -17798,6 +17844,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -17807,6 +17856,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -20124,13 +20176,13 @@ msgstr "使用圆圈来可视化数据在系统不同阶段的流动。将鼠标 msgid "Uses the first 25 values if the dimension has more." msgstr "如果维度包含超过25个值,则仅使用前25个。" -msgid "Valid" -msgstr "" - #, fuzzy msgid "Valid SQL expression" msgstr "SQL表达式" +msgid "Validate against data" +msgstr "" + msgid "Validate query" msgstr "验证查询" @@ -20146,6 +20198,9 @@ msgstr "正在验证 %s 的连接性" msgid "Validating..." msgstr "验证中..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "值" diff --git a/superset/translations/zh_TW/LC_MESSAGES/messages.po b/superset/translations/zh_TW/LC_MESSAGES/messages.po index 87d6a905ad08..a80626faed5e 100644 --- a/superset/translations/zh_TW/LC_MESSAGES/messages.po +++ b/superset/translations/zh_TW/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Apache Superset 0.22.1\n" "Report-Msgid-Bugs-To: bestlong168@gmail.com\n" -"POT-Creation-Date: 2026-10-27 21:53-0300\n" +"POT-Creation-Date: 2026-10-29 14:01+0000\n" "PO-Revision-Date: 2019-01-04 22:19+0800\n" "Last-Translator: Shao Yu-Lung \n" "Language: zh_TW\n" @@ -4237,6 +4237,11 @@ msgstr "" msgid "Checking for affected charts and dashboards…" msgstr "" +msgid "" +"Checks up to 50 rows per selected partition. Sampling cannot verify every" +" row or future ingestion." +msgstr "" + msgid "Child label position" msgstr "子標籤位置" @@ -5310,6 +5315,9 @@ msgstr "子標題" msgid "Corner Radius" msgstr "内半徑" +msgid "Correct the mapping expression before validating data." +msgstr "" + msgid "Correlation" msgstr "相關性" @@ -6068,6 +6076,12 @@ msgstr "已刷新數據" msgid "Data type" msgstr "數據類型" +msgid "Data validation failed." +msgstr "" + +msgid "Data validation requires physical columns and a numeric partition key." +msgstr "" + msgid "DataFrame include at least one series" msgstr "數據帧(DataFrame)至少包括一個序列" @@ -7883,6 +7897,9 @@ msgstr "輸入範圍篩選器的最小值和最大值" msgid "Enter report name" msgstr "報告名稱" +msgid "Enter stored epoch partition keys, not timestamps" +msgstr "" + msgid "" "Enter the email address of your account and we will send you a link to " "reset your password." @@ -8203,6 +8220,12 @@ msgstr "存在的數據集" msgid "Existing minimum: %s seconds. Editing replaces it with whole minutes." msgstr "" +msgid "Existing partition keys" +msgstr "" + +msgid "Existing partition keys (up to three, comma separated)" +msgstr "" + msgid "Exit edit mode" msgstr "" @@ -8419,6 +8442,9 @@ msgstr "SQL 表達式" msgid "Expression cannot be empty" msgstr "不能為空" +msgid "Expression evaluated — data not checked" +msgstr "" + #, python-format msgid "" "Extension '%(extension_id)s' has exceeded its persistent storage quota of" @@ -11266,6 +11292,10 @@ msgstr "將時間偏移顏色與原始系列匹配" msgid "Match type" msgstr "數據類型" +#, python-format +msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] #, fuzzy @@ -13152,6 +13182,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition mismatch found" +msgstr "" + msgid "" "Partitions whose height to parent height proportions are below this value" " are pruned" @@ -13993,6 +14026,12 @@ msgstr "排名" msgid "Ratio" msgstr "比率" +msgid "" +"Raw epoch conversion does not specify the partition bucket. Use the " +"expression that populates the partition key, including its hour or day " +"rounding and timezone. Filters will not be mirrored." +msgstr "" + msgid "Raw records" msgstr "原始紀錄" @@ -16776,6 +16815,9 @@ msgstr "部分群組無法解析,以 ID 顯示。" msgid "Some layers could not be loaded" msgstr "" +msgid "Some partitions had no checkable rows, or the query or transform failed." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -16986,6 +17028,10 @@ msgstr "源分類" msgid "Source location" msgstr "源分類" +#, python-format +msgid "Source: %(source)s; stored key: %(stored)s; transform: %(actual)s" +msgstr "" + #, fuzzy msgid "Sparkline" msgstr "標記線" @@ -18917,6 +18963,9 @@ msgid "" "it reads :value both as a timestamp and as text." msgstr "" +msgid "The transform does not match the stored partition keys." +msgstr "" + #, python-format msgid "" "The transform gives a different partition value for a timestamp " @@ -18926,6 +18975,9 @@ msgid "" "so it reads :value the same way in either form." msgstr "" +msgid "The transform matched the sampled rows, not the entire dataset." +msgstr "" + #, python-format msgid "" "The transform returned %(returned)s for %(column)s, which is %(kind)s. " @@ -21389,13 +21441,13 @@ msgstr "使用圆圈來可視化數據在系统不同階段的流動。將鼠標 msgid "Uses the first 25 values if the dimension has more." msgstr "如果維度有更多值,則使用前 25 個值。" -msgid "Valid" -msgstr "" - #, fuzzy msgid "Valid SQL expression" msgstr "SQL 表達式" +msgid "Validate against data" +msgstr "" + #, fuzzy msgid "Validate query" msgstr "查看查詢語句" @@ -21414,6 +21466,9 @@ msgstr "正在驗證 %s 的連線" msgid "Validating..." msgstr "加载中..." +msgid "Validation inconclusive" +msgstr "" + msgid "Value" msgstr "值" From f30263bc7c3c672ff6860b75220d904fda8f483e Mon Sep 17 00:00:00 2001 From: Hugh A Miles II Date: Thu, 29 Oct 2026 13:21:01 -0400 Subject: [PATCH 05/11] fix(partition-mapping): read validation samples raw, and document undetected epoch spellings An empty metrics list made the sample a GROUP BY over the whole partition before LIMIT. Docs now say which spellings the refusal does not catch, replace raw-instant examples with bucketed ones, and warn about non-UTC sessions such as IST. Co-Authored-By: Claude Opus 5.5 --- .../configuration/partition-filter-mapping.mdx | 15 ++++++++++++--- superset/connectors/sqla/partition_validation.py | 1 - .../connectors/sqla/partition_validation_test.py | 4 +++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/docs/admin_docs/configuration/partition-filter-mapping.mdx b/docs/admin_docs/configuration/partition-filter-mapping.mdx index 62390ae4ad52..a41c6738be06 100644 --- a/docs/admin_docs/configuration/partition-filter-mapping.mdx +++ b/docs/admin_docs/configuration/partition-filter-mapping.mdx @@ -82,11 +82,20 @@ query and transform-evaluation sessions; `unix_timestamp` can depend on session The numeric epoch examples avoid that conversion. Use mathematical floor, including for negative epochs. Millisecond inputs require conversion to seconds before these expressions; local-calendar-day keys are not interchangeable with fixed UTC 86,400-second buckets. +A session in a non-UTC zone shifts these boundaries: under IST (UTC+05:30) the hourly +timestamp recipe lands on the wrong hour key, five or six hours earlier, so mirrored filters +miss the matching rows. The daily recipe puts early-morning rows on the previous day. +Set the evaluating session to UTC, or use the +numeric epoch recipes. Bare `unix_timestamp(:value)` is not suggested or mirrored for temporal-to-numeric mappings on Hive/Impala and their engine-spec subclasses. It produces an instant, not an hour/day boundary, and can silently exclude matching rows. Existing expressions remain editable; replace them with the pipeline's actual partition expression. +Only that exact expression is recognised. Other spellings that still yield an unbucketed +instant, such as `CAST(unix_timestamp(:value) AS BIGINT)`, `unix_timestamp(:value) + 0` +or `floor(unix_timestamp(:value))`, or the bare form on a `STRING` timestamp column, are +not detected. Check every transform with **Validate against data**. Dataset time-range bounds already pass through Superset's timezone/hour-offset adjustment before mirroring. Do not convert those bounds from the dataset timezone a second time. @@ -124,7 +133,7 @@ Range filters — including the Explore time range, the most important case — mirrored when you check **Transform preserves ordering**. Monotonicity is a property of the *transform*, not of the column's data type. -`unix_timestamp(:value)` preserves ordering. `hour(:value)`, +`CAST(floor(unix_timestamp(:value) / 3600) * 3600 AS BIGINT)` preserves ordering. `hour(:value)`, `date_format(:value, 'dd')` and `dayofweek(:value)` are all perfectly reasonable partition transforms on a `TIMESTAMP` column and none of them do: `hour('2026-01-01 23:00')` is greater than `hour('2026-01-02 01:00')` even though the first instant is earlier. Mirroring @@ -149,7 +158,7 @@ says why. Any other engine declines too, until it is confirmed and declared. If your partition column is temporal and your transform returns text, the robust answer is to make the transform's return type match the column: `date(:value)` or `cast(... as date)` rather than `to_char(...)`. A *numeric* partition column — the -`unix_timestamp(:value)` / epoch shape — is unaffected by any of this. +epoch shape, such as `CAST(floor(unix_timestamp(:value) / 3600) * 3600 AS BIGINT)` — is unaffected by any of this. When the box is unchecked, `=` and `IN` filters still mirror; ranges do not. @@ -324,7 +333,7 @@ accepts a comparison across those types: Postgres, Trino and BigQuery refuse it SQLite compares it as never equal rather than erroring, which would drop every row the filter keeps. So Superset declines the mirror instead. The preview panel names the column and the value it got, and the fix is to cast the result to the key's own type — -`cast(unix_timestamp(:value) as string)` for a text partition key. +`date_format(:value, 'yyyyMMddHH')` for a text partition key holding hours. Because the evaluation happens in a **different session** from the chart query, transforms that call non-deterministic functions are rejected when you save. That includes `now()`, diff --git a/superset/connectors/sqla/partition_validation.py b/superset/connectors/sqla/partition_validation.py index 50de1061c6e2..72981c972b9a 100644 --- a/superset/connectors/sqla/partition_validation.py +++ b/superset/connectors/sqla/partition_validation.py @@ -103,7 +103,6 @@ def validate_partition_data( queries=[ { "columns": [mapped_column, target_name], - "metrics": [], "filters": [{"col": target_name, "op": "==", "val": key}], "row_limit": 50, "time_range": "No filter", diff --git a/tests/unit_tests/connectors/sqla/partition_validation_test.py b/tests/unit_tests/connectors/sqla/partition_validation_test.py index 64c8a00dc11e..a759407cc882 100644 --- a/tests/unit_tests/connectors/sqla/partition_validation_test.py +++ b/tests/unit_tests/connectors/sqla/partition_validation_test.py @@ -210,7 +210,7 @@ def test_data_validation_checks_corresponding_rows( assert request["filters"] == [{"col": "dt_epoch", "op": "==", "val": 3600}] assert request["columns"] == ["event_time", "dt_epoch"] assert request["row_limit"] == 50 - assert request["metrics"] == [] + assert "metrics" not in request assert probe.call_args.kwargs["fresh"] is True if status == "mismatch": assert result["examples"][0]["stored_key"] == "3600" @@ -355,4 +355,6 @@ def fetch(sql: str, *args: object, **kwargs: Any) -> pd.DataFrame: assert len(reads) == 2 assert all("LIMIT 50" in sql and "country = 'allowed'" in sql for sql in reads) assert all("COUNT(" not in sql.upper() for sql in executed) + # A raw read stops at the limit; GROUP BY would aggregate the whole partition. + assert all("GROUP BY" not in sql.upper() for sql in reads) connection.close() From ee4f46001e0a806228f1275fa14055d58cb88126 Mon Sep 17 00:00:00 2001 From: Hugh A Miles II Date: Thu, 29 Oct 2026 14:42:28 -0400 Subject: [PATCH 06/11] fix(partition-mapping): decline any transform answering raw epoch instants The text match caught only the bare former default; CAST(...), + 0, * 1, floor(...) and STRING timestamp columns still mirrored raw instants onto hour/day keys and dropped rows. Probe two canary instants 2843 seconds apart for temporal-to-numeric mappings and decline when the answers keep that distance. The canaries are a separate, cached probe, so filter-value probes and their cache keys are unchanged. Co-Authored-By: Claude Opus 5.5 --- UPDATING.md | 2 +- .../partition-filter-mapping.mdx | 12 +- superset/connectors/sqla/partition_mapping.py | 159 ++++++++++++++++-- .../sqla/partition_validation_test.py | 12 +- .../models/partition_mirroring_test.py | 81 +++++++++ 5 files changed, 237 insertions(+), 29 deletions(-) diff --git a/UPDATING.md b/UPDATING.md index 9d17d4e75705..00a6067f9a7e 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -24,7 +24,7 @@ assists people when migrating to a new version. ## Next -- Partition filter mapping no longer suggests bare `unix_timestamp(:value)` on Hive/Impala-family engines. Existing temporal-to-numeric mappings using that expression stop pruning to prevent incorrect counts on hour/day epoch keys. Replace it with the expression that populates the partition key, including rounding and timezone. The dataset editor can explicitly compare a candidate against sampled rows from selected numeric partitions; a sample match is not a guarantee for the entire dataset. +- Partition filter mapping no longer suggests bare `unix_timestamp(:value)` on Hive/Impala-family engines. Existing temporal-to-numeric mappings using that expression, or any transform that answers raw epoch instants (for example `CAST(unix_timestamp(:value) AS BIGINT)`), stop pruning to prevent incorrect counts on hour/day epoch keys; this includes keys that really store raw epoch seconds. Replace it with the expression that populates the partition key, including rounding and timezone. The dataset editor can explicitly compare a candidate against sampled rows from selected numeric partitions; a sample match is not a guarantee for the entire dataset. - Refreshing a dataset's columns from its source (the "Sync columns from source" button, `PUT /api/v1/dataset/?override_columns=true`, or diff --git a/docs/admin_docs/configuration/partition-filter-mapping.mdx b/docs/admin_docs/configuration/partition-filter-mapping.mdx index a41c6738be06..8d1fbba07589 100644 --- a/docs/admin_docs/configuration/partition-filter-mapping.mdx +++ b/docs/admin_docs/configuration/partition-filter-mapping.mdx @@ -92,10 +92,14 @@ Bare `unix_timestamp(:value)` is not suggested or mirrored for temporal-to-numer mappings on Hive/Impala and their engine-spec subclasses. It produces an instant, not an hour/day boundary, and can silently exclude matching rows. Existing expressions remain editable; replace them with the pipeline's actual partition expression. -Only that exact expression is recognised. Other spellings that still yield an unbucketed -instant, such as `CAST(unix_timestamp(:value) AS BIGINT)`, `unix_timestamp(:value) + 0` -or `floor(unix_timestamp(:value))`, or the bare form on a `STRING` timestamp column, are -not detected. Check every transform with **Validate against data**. +On any engine, a transform from a timestamp column (or a text column flagged as a +datetime) onto a numeric key is also evaluated at two instants 2,843 seconds apart within +one hour. If its answers are exactly that far apart (or 2,843,000, for milliseconds), it +returns raw instants, however it is spelled: `CAST(unix_timestamp(:value) AS BIGINT)`, +`unix_timestamp(:value) + 0` and `floor(unix_timestamp(:value))` are all declined. A key +that really stores raw epoch seconds is declined too; queries then scan every partition +but return correct rows. This check cannot catch a wrong bucket size or timezone, so still +check every transform with **Validate against data**. Dataset time-range bounds already pass through Superset's timezone/hour-offset adjustment before mirroring. Do not convert those bounds from the dataset timezone a second time. diff --git a/superset/connectors/sqla/partition_mapping.py b/superset/connectors/sqla/partition_mapping.py index 7c4ad5db6250..3b347b412154 100644 --- a/superset/connectors/sqla/partition_mapping.py +++ b/superset/connectors/sqla/partition_mapping.py @@ -185,6 +185,7 @@ from collections.abc import Mapping, Sequence from dataclasses import dataclass from datetime import date, datetime, time, timedelta +from decimal import Decimal from functools import lru_cache from typing import Any, cast, TYPE_CHECKING @@ -1157,16 +1158,137 @@ def epoch_mapping_refusal( "mapped_column": str(mapped_column), "partition_column": str(partition_column), "value_transform": transform, - "message": str( - _( - "Raw epoch conversion does not specify the partition bucket. " - "Use the expression that populates the partition key, including " - "its hour or day rounding and timezone. Filters will not be mirrored." - ) - ), + "message": _unbucketed_epoch_message(), } +def _unbucketed_epoch_message() -> str: + return str( + _( + "Raw epoch conversion does not specify the partition bucket. " + "Use the expression that populates the partition key, including " + "its hour or day rounding and timezone. Filters will not be mirrored." + ) + ) + + +#: Two instants 2843 seconds apart within one hour, probed for every +#: temporal-to-numeric mirror. A transform that keeps that distance is answering +#: raw epoch seconds (or milliseconds), not an hour or day key, whatever its +#: spelling -- `CAST(unix_timestamp(:value) AS BIGINT)`, `+ 0`, +#: `floor(unix_timestamp(:value))`. Mirroring raw instants onto bucketed keys +#: drops rows; a partition per second is not a layout a warehouse survives, so +#: declining costs pruning, never correctness. +_EPOCH_CANARIES = (datetime(2001, 1, 1, 10, 0, 0), datetime(2001, 1, 1, 10, 47, 23)) +_RAW_INSTANT_STEPS = {2843, 2843000} + + +def _epoch_canaries( + datasource: SqlaTable, + mapped_column: str, + partition_column: TableColumn, +) -> list[Any]: + """The canary inputs for this mapping, empty when the check does not apply.""" + source = next( + (col for col in datasource.columns if col.column_name == mapped_column), + None, + ) + if ( + source is None + or _native_generic_type(partition_column) != utils.GenericDataType.NUMERIC + ): + return [] + source_type = _native_generic_type(source) + if source_type == utils.GenericDataType.TEMPORAL: + return list(_EPOCH_CANARIES) + if source_type == utils.GenericDataType.STRING and source.is_dttm: + # A text timestamp column binds the text the author typed. + return [canary.isoformat(sep=" ") for canary in _EPOCH_CANARIES] + return [] + + +def _canary_answers( + datasource: SqlaTable, + mapped_column: str, + partition_column: TableColumn, + mapping: PartitionMapping, +) -> list[Any] | None: + """ + The transform's answers at the canaries, or ``None`` when not applicable. + + A probe of its own rather than extra values in the chart's batch, so the + filter values' probe and its cache entry are untouched; the canaries are + constant, so after the first chart this is a cache hit. Calls `_probe` + rather than `_run_probe` so a canary the engine rejects records no verdict + about a transform that evaluates the filter values perfectly well. + """ + canaries = _epoch_canaries(datasource, mapped_column, partition_column) + if not canaries: + return None + database = datasource.database + key = _probe_cache_key( + database, + datasource.catalog, + datasource.schema, + mapping.value_transform, + canaries, + ) + answers = _cache_get(key) + if answers is None: + answers = _probe( + database, + datasource.catalog, + datasource.schema, + mapping.value_transform, + canaries, + ) + if answers is not None: + _cache_set(key, answers) + return answers + + +def _declined_as_raw_instants( + datasource: SqlaTable, + mapping: PartitionMapping, + partition_column: TableColumn, + epoch_errors: list[str] | None, +) -> bool: + """Whether to decline because the transform answers raw epoch instants.""" + if not _answers_raw_instants( + _canary_answers(datasource, mapping.mapped_column, partition_column, mapping) + ): + return False + logger.warning( + "Partition transform answers raw epoch instants for a numeric key; " + "queries will not prune" + ) + # Every probe of this transform re-records it, cache hit or not, so the + # editor and Explore stop promising pruning the query does not carry. + record_mirror_verdict( + datasource.database, + datasource.catalog, + datasource.schema, + mapping.value_transform, + mirrors=False, + ) + if epoch_errors is not None: + epoch_errors.append(_unbucketed_epoch_message()) + return True + + +def _answers_raw_instants(answers: list[Any] | None) -> bool: + """Whether the canary answers sit exactly as far apart as their inputs.""" + if not answers or len(answers) != len(_EPOCH_CANARIES): + return False + low, high = (_to_python_scalar(answer) for answer in answers) + if any( + isinstance(answer, bool) or not isinstance(answer, (int, float, Decimal)) + for answer in (low, high) + ): + return False + return high - low in _RAW_INSTANT_STEPS + + def resolve_partition_mapping(datasource: SqlaTable) -> PartitionMapping | None: """ Resolve the dataset's mapping, or ``None`` when nothing may be mirrored. @@ -3168,6 +3290,7 @@ def _preview_probe_value( type_errors: list[str] = [] escaping_errors: list[str] = [] shape_errors: list[str] = [] + epoch_errors: list[str] = [] try: predicates = build_mirrored_predicates( datasource, @@ -3177,6 +3300,7 @@ def _preview_probe_value( type_errors=type_errors, escaping_errors=escaping_errors, shape_errors=shape_errors, + epoch_errors=epoch_errors, ) except Exception: # pylint: disable=broad-except # The chart path fails open on the same call; the preview reports it @@ -3188,6 +3312,13 @@ def _preview_probe_value( "sample_input": sample_input, "error": _("The transform could not be evaluated against the database."), } + if epoch_errors: + return { + "valid": False, + "reason": "unbucketed_epoch", + "sample_input": sample_input, + "error": epoch_errors[0], + } if shape_errors: return { "valid": False, @@ -3500,6 +3631,7 @@ def build_mirrored_predicates( type_errors: list[str] | None = None, escaping_errors: list[str] | None = None, shape_errors: list[str] | None = None, + epoch_errors: list[str] | None = None, ) -> list[ColumnElement[Any]]: """ Turn collected ``(operator, value)`` mirror requests into predicates. @@ -3527,13 +3659,10 @@ def build_mirrored_predicates( this database cannot be asked about" is a third problem, and the only one of the three whose fix is to stop the transform producing the character. + :param epoch_errors: optional sink for a transform answering raw epoch + instants onto a numeric key -- see `_EPOCH_CANARIES`. """ - if not requests or epoch_mapping_refusal( - datasource, - mapping.mapped_column, - mapping.partition_column, - mapping.value_transform, - ): + if not requests: return [] partition_column = next( @@ -3572,7 +3701,9 @@ def build_mirrored_predicates( if not _bounds_are_ordered(evaluated, spans): return [] - if _declined_for_reading_by_type(flat, evaluated, text_answers, shape_errors): + if _declined_for_reading_by_type( + flat, evaluated, text_answers, shape_errors + ) or _declined_as_raw_instants(datasource, mapping, partition_column, epoch_errors): return [] # Declining here is the last chance to decline at all: once these diff --git a/tests/unit_tests/connectors/sqla/partition_validation_test.py b/tests/unit_tests/connectors/sqla/partition_validation_test.py index a759407cc882..a52e3f7ba5a8 100644 --- a/tests/unit_tests/connectors/sqla/partition_validation_test.py +++ b/tests/unit_tests/connectors/sqla/partition_validation_test.py @@ -26,10 +26,8 @@ from flask import Flask from superset.connectors.sqla.partition_mapping import ( - build_mirrored_predicates, epoch_mapping_refusal, evaluate_transform, - PartitionMapping, preview_partition_mapping, resolve_partition_mapping, ) @@ -45,7 +43,7 @@ from superset.db_engine_specs.spark import SparkEngineSpec from superset.exceptions import SupersetSecurityException from superset.models.core import Database -from superset.utils.core import FilterOperator, QueryStatus +from superset.utils.core import QueryStatus from tests.unit_tests.models.partition_mirroring_test import _table @@ -88,14 +86,8 @@ def test_former_default_is_declined_without_probing( ): assert spec.partition_value_transform_default is None assert epoch_mapping_refusal(table, "event_time", "dt_epoch", transform) + # The chart path reaches `build_mirrored_predicates` only through this. assert resolve_partition_mapping(table) is None - mapping = PartitionMapping("dt_epoch", "event_time", transform, True, True) - assert ( - build_mirrored_predicates( - table, mapping, [(FilterOperator.EQUALS, "2026-01-15 10:47:23")] - ) - == [] - ) preview = preview_partition_mapping( table, mapped_column="event_time", diff --git a/tests/unit_tests/models/partition_mirroring_test.py b/tests/unit_tests/models/partition_mirroring_test.py index 15daf90c86c6..1bf2601281b0 100644 --- a/tests/unit_tests/models/partition_mirroring_test.py +++ b/tests/unit_tests/models/partition_mirroring_test.py @@ -3357,3 +3357,84 @@ def test_epoch_bucket_queries_preserve_actual_rows( connection.execute(unmirrored_sql).fetchall() ) connection.close() + + +@pytest.mark.parametrize("source_type", ["TIMESTAMP", "VARCHAR"]) +@pytest.mark.parametrize( + "transform", + [ + "unix_timestamp(:value)", + "CAST(unix_timestamp(:value) AS BIGINT)", + "unix_timestamp(:value) + 0", + "unix_timestamp(:value) * 1", + "floor(unix_timestamp(:value))", + ], +) +def test_a_raw_instant_transform_is_declined_onto_hourly_keys( + app: Flask, source_type: str, transform: str +) -> None: + """ + Any spelling of a raw-instant transform, on a timestamp or a text timestamp + column, would drop rows from hour-bucketed keys; the canaries decline it. + """ + import math + import sqlite3 + from datetime import timezone + + from superset.connectors.sqla.partition_mapping import ( + preview_partition_mapping, + ) + + connection = sqlite3.connect(":memory:") + connection.create_function("floor", 1, math.floor) + connection.create_function( + "unix_timestamp", + 1, + lambda value: int( + datetime.fromisoformat(value).replace(tzinfo=timezone.utc).timestamp() + ), + ) + connection.execute( + "CREATE TABLE web_events (country TEXT, event_time TEXT, dt_epoch BIGINT)" + ) + origin = 1790812800 # 2026-10-01 UTC + connection.executemany( + "INSERT INTO web_events VALUES (?, ?, ?)", + [ + ( + str(offset), + datetime.fromtimestamp(origin + offset, timezone.utc).strftime( + "%Y-%m-%d %H:%M:%S" + ), + (origin + offset) // 3600 * 3600, + ) + for offset in (37800, 38000, 39599) + ], + ) + table = _table(transform=transform) + next(c for c in table.columns if c.column_name == "event_time").type = source_type + arguments = { + "filter": [{"col": "event_time", "op": "==", "val": "2026-10-01 10:33:20"}] + } + with ( + app.app_context(), + patch.object( + Database, + "get_df", + side_effect=lambda sql, **kwargs: pd.read_sql_query(sql, connection), + ), + ): + mirrored_sql = _query(table, **arguments) + preview = preview_partition_mapping( + table, + mapped_column="event_time", + value_transform=transform, + sample_values=["2026-10-01 10:33:20"], + ) + table.partition_column = None + unmirrored_sql = _query(table, **arguments) + assert "dt_epoch" not in mirrored_sql + assert connection.execute(mirrored_sql).fetchall() == [("38000",)] + assert connection.execute(unmirrored_sql).fetchall() == [("38000",)] + assert preview["reason"] == "unbucketed_epoch" + connection.close() From 30f07693c72300f90d8b5a99ec23c818a9661416 Mon Sep 17 00:00:00 2001 From: Hugh A Miles II Date: Thu, 29 Oct 2026 14:49:55 -0400 Subject: [PATCH 07/11] fix(partition-mapping): limit the raw-instant check to Hive/Impala Elsewhere a raw epoch column is an ordinary index to prune on. Co-Authored-By: Claude Opus 5.5 --- .../partition-filter-mapping.mdx | 2 +- superset/connectors/sqla/partition_mapping.py | 12 +++++++-- .../models/partition_mirroring_test.py | 26 +++++++++++++------ 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/docs/admin_docs/configuration/partition-filter-mapping.mdx b/docs/admin_docs/configuration/partition-filter-mapping.mdx index 8d1fbba07589..19f805b68192 100644 --- a/docs/admin_docs/configuration/partition-filter-mapping.mdx +++ b/docs/admin_docs/configuration/partition-filter-mapping.mdx @@ -92,7 +92,7 @@ Bare `unix_timestamp(:value)` is not suggested or mirrored for temporal-to-numer mappings on Hive/Impala and their engine-spec subclasses. It produces an instant, not an hour/day boundary, and can silently exclude matching rows. Existing expressions remain editable; replace them with the pipeline's actual partition expression. -On any engine, a transform from a timestamp column (or a text column flagged as a +On the same engines, a transform from a timestamp column (or a text column flagged as a datetime) onto a numeric key is also evaluated at two instants 2,843 seconds apart within one hour. If its answers are exactly that far apart (or 2,843,000, for milliseconds), it returns raw instants, however it is spelled: `CAST(unix_timestamp(:value) AS BIGINT)`, diff --git a/superset/connectors/sqla/partition_mapping.py b/superset/connectors/sqla/partition_mapping.py index 3b347b412154..bfe38a617f52 100644 --- a/superset/connectors/sqla/partition_mapping.py +++ b/superset/connectors/sqla/partition_mapping.py @@ -1177,8 +1177,8 @@ def _unbucketed_epoch_message() -> str: #: raw epoch seconds (or milliseconds), not an hour or day key, whatever its #: spelling -- `CAST(unix_timestamp(:value) AS BIGINT)`, `+ 0`, #: `floor(unix_timestamp(:value))`. Mirroring raw instants onto bucketed keys -#: drops rows; a partition per second is not a layout a warehouse survives, so -#: declining costs pruning, never correctness. +#: drops rows; a Hive/Impala partition per second is not a layout a metastore +#: survives, so declining costs pruning, never correctness. _EPOCH_CANARIES = (datetime(2001, 1, 1, 10, 0, 0), datetime(2001, 1, 1, 10, 47, 23)) _RAW_INSTANT_STEPS = {2843, 2843000} @@ -1189,6 +1189,12 @@ def _epoch_canaries( partition_column: TableColumn, ) -> list[Any]: """The canary inputs for this mapping, empty when the check does not apply.""" + from superset.db_engine_specs.hive import HiveEngineSpec + from superset.db_engine_specs.impala import ImpalaEngineSpec + + # Elsewhere a raw epoch column is an ordinary index to prune on. + if not issubclass(datasource.db_engine_spec, (HiveEngineSpec, ImpalaEngineSpec)): + return [] source = next( (col for col in datasource.columns if col.column_name == mapped_column), None, @@ -1242,6 +1248,8 @@ def _canary_answers( mapping.value_transform, canaries, ) + # A failure is not cached: a transient blip must not switch the check + # off for the whole cache timeout. if answers is not None: _cache_set(key, answers) return answers diff --git a/tests/unit_tests/models/partition_mirroring_test.py b/tests/unit_tests/models/partition_mirroring_test.py index 1bf2601281b0..3f2c23f889fd 100644 --- a/tests/unit_tests/models/partition_mirroring_test.py +++ b/tests/unit_tests/models/partition_mirroring_test.py @@ -3375,15 +3375,17 @@ def test_a_raw_instant_transform_is_declined_onto_hourly_keys( ) -> None: """ Any spelling of a raw-instant transform, on a timestamp or a text timestamp - column, would drop rows from hour-bucketed keys; the canaries decline it. + column, would drop rows from hour-bucketed Hive keys; the canaries decline it. """ import math import sqlite3 from datetime import timezone + from unittest.mock import PropertyMock from superset.connectors.sqla.partition_mapping import ( preview_partition_mapping, ) + from superset.db_engine_specs.hive import HiveEngineSpec connection = sqlite3.connect(":memory:") connection.create_function("floor", 1, math.floor) @@ -3424,13 +3426,21 @@ def test_a_raw_instant_transform_is_declined_onto_hourly_keys( side_effect=lambda sql, **kwargs: pd.read_sql_query(sql, connection), ), ): - mirrored_sql = _query(table, **arguments) - preview = preview_partition_mapping( - table, - mapped_column="event_time", - value_transform=transform, - sample_values=["2026-10-01 10:33:20"], - ) + # Elsewhere a raw epoch column is an ordinary index, so it still mirrors. + assert "dt_epoch" in _query(table, **arguments) + with patch.object( + Database, + "db_engine_spec", + new_callable=PropertyMock, + return_value=HiveEngineSpec, + ): + mirrored_sql = _query(table, **arguments) + preview = preview_partition_mapping( + table, + mapped_column="event_time", + value_transform=transform, + sample_values=["2026-10-01 10:33:20"], + ) table.partition_column = None unmirrored_sql = _query(table, **arguments) assert "dt_epoch" not in mirrored_sql From 105baf0537b61b94b4b51e61cf10be87340e8a73 Mon Sep 17 00:00:00 2001 From: Hugh A Miles II Date: Thu, 29 Oct 2026 19:07:00 -0400 Subject: [PATCH 08/11] fix(partition-mapping): catch raw instants in every unit and text layout QA's rerun on Hive 4.0.1 and Impala 4.4.1 found three ways a raw-instant transform still mirrored and dropped rows: - a STRING timestamp column left at the default is_dttm=false was never checked; - microsecond instants (`* 1000000`, Impala's `utc_to_unix_micros`) were not recognised; - text in ISO layout with a `T` was asked only with a space, answered NULL, and skipped the check. Text columns are now asked in each common layout plus their own python_date_format, flagged temporal or not, and the step matches seconds through nanoseconds. If an engine raises on one layout, each pair is probed alone. The dataset API reports a refusal that a probe has already cached, so safety_refusal stops reading null for it. Co-Authored-By: Claude Opus 5.5 --- UPDATING.md | 2 +- .../partition-filter-mapping.mdx | 15 +- superset/connectors/sqla/models.py | 3 + superset/connectors/sqla/partition_mapping.py | 139 +++++++++++++--- .../models/partition_mirroring_test.py | 150 +++++++++++++++++- 5 files changed, 281 insertions(+), 28 deletions(-) diff --git a/UPDATING.md b/UPDATING.md index 00a6067f9a7e..3e84bbb1e45a 100644 --- a/UPDATING.md +++ b/UPDATING.md @@ -24,7 +24,7 @@ assists people when migrating to a new version. ## Next -- Partition filter mapping no longer suggests bare `unix_timestamp(:value)` on Hive/Impala-family engines. Existing temporal-to-numeric mappings using that expression, or any transform that answers raw epoch instants (for example `CAST(unix_timestamp(:value) AS BIGINT)`), stop pruning to prevent incorrect counts on hour/day epoch keys; this includes keys that really store raw epoch seconds. Replace it with the expression that populates the partition key, including rounding and timezone. The dataset editor can explicitly compare a candidate against sampled rows from selected numeric partitions; a sample match is not a guarantee for the entire dataset. +- Partition filter mapping no longer suggests bare `unix_timestamp(:value)` on Hive/Impala-family engines. Existing temporal-to-numeric mappings using that expression, or any transform that answers raw epoch instants in seconds through nanoseconds (for example `CAST(unix_timestamp(:value) AS BIGINT)` or `utc_to_unix_micros(:value)`, from a timestamp column or a text one in any common layout), stop pruning to prevent incorrect counts on hour/day epoch keys; this includes keys that really store raw epoch instants. Replace it with the expression that populates the partition key, including rounding and timezone. The dataset editor can explicitly compare a candidate against sampled rows from selected numeric partitions; a sample match is not a guarantee for the entire dataset. - Refreshing a dataset's columns from its source (the "Sync columns from source" button, `PUT /api/v1/dataset/?override_columns=true`, or diff --git a/docs/admin_docs/configuration/partition-filter-mapping.mdx b/docs/admin_docs/configuration/partition-filter-mapping.mdx index 19f805b68192..938043133ef0 100644 --- a/docs/admin_docs/configuration/partition-filter-mapping.mdx +++ b/docs/admin_docs/configuration/partition-filter-mapping.mdx @@ -92,12 +92,15 @@ Bare `unix_timestamp(:value)` is not suggested or mirrored for temporal-to-numer mappings on Hive/Impala and their engine-spec subclasses. It produces an instant, not an hour/day boundary, and can silently exclude matching rows. Existing expressions remain editable; replace them with the pipeline's actual partition expression. -On the same engines, a transform from a timestamp column (or a text column flagged as a -datetime) onto a numeric key is also evaluated at two instants 2,843 seconds apart within -one hour. If its answers are exactly that far apart (or 2,843,000, for milliseconds), it -returns raw instants, however it is spelled: `CAST(unix_timestamp(:value) AS BIGINT)`, -`unix_timestamp(:value) + 0` and `floor(unix_timestamp(:value))` are all declined. A key -that really stores raw epoch seconds is declined too; queries then scan every partition +On the same engines, a transform from a timestamp or text column onto a numeric key is +also evaluated at two instants 2,843 seconds apart within one hour. A text column is asked +in each common layout (`2001-01-01 10:00:00`, `2001-01-01T10:00:00`, +`2001-01-01T10:00:00Z`, and its own datetime format, if set), whether or not it is flagged +as a datetime. If any answers are exactly that far apart in seconds, milliseconds, +microseconds or nanoseconds, the transform returns raw instants, however it is spelled: +`CAST(unix_timestamp(:value) AS BIGINT)`, `unix_timestamp(:value) + 0`, +`floor(unix_timestamp(:value))` and `utc_to_unix_micros(:value)` are all declined. A key +that really stores raw epoch instants is declined too; queries then scan every partition but return correct rows. This check cannot catch a wrong bucket size or timezone, so still check every transform with **Validate against data**. diff --git a/superset/connectors/sqla/models.py b/superset/connectors/sqla/models.py index 64c3bc6273c4..89fd07848670 100644 --- a/superset/connectors/sqla/models.py +++ b/superset/connectors/sqla/models.py @@ -73,6 +73,7 @@ from superset import db, is_feature_enabled, security_manager from superset.common.db_query_status import QueryStatus from superset.connectors.sqla.partition_mapping import ( + cached_raw_instant_refusal, declares_array_type, epoch_mapping_refusal, equality_mirrors_safely, @@ -2315,6 +2316,8 @@ def partition_filter_mapping_summary(self) -> dict[str, Any] | None: transform = mapped_column.partition_value_transform if mapped_column else None safety_refusal = epoch_mapping_refusal( self, mapped_column_name, self.partition_column, transform + ) or cached_raw_instant_refusal( + self, mapped_column_name, self.partition_column, transform ) active = bool( not safety_refusal diff --git a/superset/connectors/sqla/partition_mapping.py b/superset/connectors/sqla/partition_mapping.py index bfe38a617f52..8a4eb6535700 100644 --- a/superset/connectors/sqla/partition_mapping.py +++ b/superset/connectors/sqla/partition_mapping.py @@ -1174,13 +1174,14 @@ def _unbucketed_epoch_message() -> str: #: Two instants 2843 seconds apart within one hour, probed for every #: temporal-to-numeric mirror. A transform that keeps that distance is answering -#: raw epoch seconds (or milliseconds), not an hour or day key, whatever its -#: spelling -- `CAST(unix_timestamp(:value) AS BIGINT)`, `+ 0`, -#: `floor(unix_timestamp(:value))`. Mirroring raw instants onto bucketed keys -#: drops rows; a Hive/Impala partition per second is not a layout a metastore -#: survives, so declining costs pruning, never correctness. +#: raw epoch instants, not an hour or day key, whatever its spelling -- +#: `CAST(unix_timestamp(:value) AS BIGINT)`, `+ 0`, `floor(unix_timestamp(:value))`, +#: Impala's `utc_to_unix_micros(:value)`. Mirroring raw instants onto bucketed +#: keys drops rows; a Hive/Impala partition per second is not a layout a +#: metastore survives, so declining costs pruning, never correctness. _EPOCH_CANARIES = (datetime(2001, 1, 1, 10, 0, 0), datetime(2001, 1, 1, 10, 47, 23)) -_RAW_INSTANT_STEPS = {2843, 2843000} +#: That distance in seconds, milliseconds, microseconds and nanoseconds. +_RAW_INSTANT_STEPS = {2843 * 1000**power for power in range(4)} def _epoch_canaries( @@ -1188,7 +1189,11 @@ def _epoch_canaries( mapped_column: str, partition_column: TableColumn, ) -> list[Any]: - """The canary inputs for this mapping, empty when the check does not apply.""" + """ + The canary inputs for this mapping, empty when the check does not apply. + + A flat list of pairs, one pair per spelling of the two instants. + """ from superset.db_engine_specs.hive import HiveEngineSpec from superset.db_engine_specs.impala import ImpalaEngineSpec @@ -1207,12 +1212,31 @@ def _epoch_canaries( source_type = _native_generic_type(source) if source_type == utils.GenericDataType.TEMPORAL: return list(_EPOCH_CANARIES) - if source_type == utils.GenericDataType.STRING and source.is_dttm: - # A text timestamp column binds the text the author typed. - return [canary.isoformat(sep=" ") for canary in _EPOCH_CANARIES] + if source_type == utils.GenericDataType.STRING: + return _text_epoch_canaries(source) return [] +def _text_epoch_canaries(source: TableColumn) -> list[str]: + """ + The canaries as the text a timestamp column may hold, one pair per form. + + Whether or not the column is flagged temporal: ``is_dttm`` defaults to + false, and a filter binds the text the author typed either way. A transform + parsing one layout answers ``NULL`` for the others, so each common layout + gets a pair, plus the column's own `python_date_format`. + """ + formats = ["%Y-%m-%d %H:%M:%S", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%dT%H:%M:%SZ"] + date_format = source.python_date_format + if date_format and date_format not in ("epoch_s", "epoch_ms"): + formats.append(date_format) + pairs = utils.remove_duplicates( + tuple(canary.strftime(layout) for canary in _EPOCH_CANARIES) + for layout in formats + ) + return [text for pair in pairs for text in pair] + + def _canary_answers( datasource: SqlaTable, mapped_column: str, @@ -1241,13 +1265,7 @@ def _canary_answers( ) answers = _cache_get(key) if answers is None: - answers = _probe( - database, - datasource.catalog, - datasource.schema, - mapping.value_transform, - canaries, - ) + answers = _probe_canaries(datasource, mapping.value_transform, canaries) # A failure is not cached: a transient blip must not switch the check # off for the whole cache timeout. if answers is not None: @@ -1255,6 +1273,79 @@ def _canary_answers( return answers +def cached_raw_instant_refusal( + datasource: SqlaTable, + mapped_column: str | None, + partition_column: str | None, + transform: str | None, +) -> dict[str, str] | None: + """ + The raw-instant refusal, as far as an earlier probe already answered it. + + Reads the canary cache and never probes, so the dataset API can report a + transform the engine was seen to refuse without a round trip per request; + ``None`` on a cold cache, as ``evaluable`` is. + """ + target = next( + (col for col in datasource.columns if col.column_name == partition_column), + None, + ) + if not transform or not mapped_column or target is None: + return None + canaries = _epoch_canaries(datasource, mapped_column, target) + if not canaries: + return None + key = _probe_cache_key( + datasource.database, + datasource.catalog, + datasource.schema, + transform, + canaries, + ) + if not _answers_raw_instants(_cache_get(key)): + return None + return { + "reason": "unbucketed_epoch", + "mapped_column": mapped_column, + "partition_column": str(partition_column), + "value_transform": transform, + "message": _unbucketed_epoch_message(), + } + + +def _probe_canaries( + datasource: SqlaTable, transform: str, canaries: list[Any] +) -> list[Any] | None: + """ + Probe every canary pair at once, falling back to a probe per pair. + + An engine that raises on a text layout its transform cannot parse, rather + than answering ``NULL``, fails the whole batch; the other layouts must still + be asked. A pair that fails alone answers ``None`` twice, and ``None`` + overall only when every pair failed. + """ + database = datasource.database + answers = _probe( + database, datasource.catalog, datasource.schema, transform, canaries + ) + if answers is not None or len(canaries) <= len(_EPOCH_CANARIES): + return answers + step = len(_EPOCH_CANARIES) + per_pair = [ + _probe( + database, + datasource.catalog, + datasource.schema, + transform, + canaries[start : start + step], + ) + for start in range(0, len(canaries), step) + ] + if all(pair is None for pair in per_pair): + return None + return [answer for pair in per_pair for answer in (pair or [None] * step)] + + def _declined_as_raw_instants( datasource: SqlaTable, mapping: PartitionMapping, @@ -1285,10 +1376,18 @@ def _declined_as_raw_instants( def _answers_raw_instants(answers: list[Any] | None) -> bool: - """Whether the canary answers sit exactly as far apart as their inputs.""" - if not answers or len(answers) != len(_EPOCH_CANARIES): + """Whether any pair of canary answers sits exactly as far apart as its inputs.""" + step = len(_EPOCH_CANARIES) + if not answers or len(answers) % step: return False - low, high = (_to_python_scalar(answer) for answer in answers) + return any( + _pair_is_raw_instants(answers[start : start + step]) + for start in range(0, len(answers), step) + ) + + +def _pair_is_raw_instants(pair: list[Any]) -> bool: + low, high = (_to_python_scalar(answer) for answer in pair) if any( isinstance(answer, bool) or not isinstance(answer, (int, float, Decimal)) for answer in (low, high) diff --git a/tests/unit_tests/models/partition_mirroring_test.py b/tests/unit_tests/models/partition_mirroring_test.py index 3f2c23f889fd..3cbc1413584e 100644 --- a/tests/unit_tests/models/partition_mirroring_test.py +++ b/tests/unit_tests/models/partition_mirroring_test.py @@ -24,6 +24,7 @@ from __future__ import annotations +from collections.abc import Callable from datetime import date, datetime from typing import Any from unittest.mock import MagicMock, patch @@ -43,7 +44,8 @@ from superset.utils import json from superset.utils.core import FilterOperator -PROBE = "superset.connectors.sqla.partition_mapping.evaluate_transform" +PARTITION_MAPPING = "superset.connectors.sqla.partition_mapping" +PROBE = f"{PARTITION_MAPPING}.evaluate_transform" @pytest.fixture(autouse=True) @@ -3448,3 +3450,149 @@ def test_a_raw_instant_transform_is_declined_onto_hourly_keys( assert connection.execute(unmirrored_sql).fetchall() == [("38000",)] assert preview["reason"] == "unbucketed_epoch" connection.close() + + +@pytest.mark.parametrize( + "source_type, is_dttm, layout, transform, key_scale", + [ + # A text timestamp column left at the default, not flagged temporal. + ("VARCHAR", False, "%Y-%m-%d %H:%M:%S", "unix_timestamp(:value)", 1), + # Microsecond instants onto a microsecond hour key. + ( + "TIMESTAMP", + True, + "%Y-%m-%d %H:%M:%S", + "unix_timestamp(:value) * 1000000", + 1000000, + ), + # ISO text with a `T`, parsed by a transform that reads no other layout. + ("VARCHAR", True, "%Y-%m-%dT%H:%M:%S", "iso_seconds(:value)", 1), + ("VARCHAR", False, "%Y-%m-%dT%H:%M:%S", "iso_seconds(:value)", 1), + ], +) +def test_raw_instants_are_declined_in_every_unit_and_text_layout( + app: Flask, + source_type: str, + is_dttm: bool, + layout: str, + transform: str, + key_scale: int, +) -> None: + """ + Raw instants are declined whatever their unit, and on text columns whatever + their layout or temporal flag; each of these dropped rows from hourly keys. + """ + import sqlite3 + from datetime import timezone + from unittest.mock import PropertyMock + + from superset.connectors.sqla.partition_mapping import ( + preview_partition_mapping, + ) + from superset.db_engine_specs.hive import HiveEngineSpec + + def seconds_if(separator: str) -> Callable[[str], int | None]: + """Epoch seconds of text in one layout only, as Hive's parsers read it.""" + + def parse(value: str) -> int | None: + if not isinstance(value, str) or value[10:11] != separator: + return None + try: + parsed = datetime.fromisoformat(value) + except ValueError: + return None + return int(parsed.replace(tzinfo=timezone.utc).timestamp()) + + return parse + + connection = sqlite3.connect(":memory:") + connection.create_function("unix_timestamp", 1, seconds_if(" ")) + connection.create_function("iso_seconds", 1, seconds_if("T")) + connection.execute( + "CREATE TABLE web_events (country TEXT, event_time TEXT, dt_epoch BIGINT)" + ) + origin = 1790812800 # 2026-10-01 UTC + connection.executemany( + "INSERT INTO web_events VALUES (?, ?, ?)", + [ + ( + str(offset), + datetime.fromtimestamp(origin + offset, timezone.utc).strftime(layout), + (origin + offset) // 3600 * 3600 * key_scale, + ) + for offset in (37800, 38000, 39599) + ], + ) + table = _table(transform=transform) + event_time = next(c for c in table.columns if c.column_name == "event_time") + event_time.type = source_type + event_time.is_dttm = is_dttm + value = datetime(2026, 10, 1, 10, 33, 20).strftime(layout) + arguments = {"filter": [{"col": "event_time", "op": "==", "val": value}]} + probes: dict[str, Any] = {} + with ( + app.app_context(), + patch.object( + Database, + "get_df", + side_effect=lambda sql, **kwargs: pd.read_sql_query(sql, connection), + ), + patch(f"{PARTITION_MAPPING}._cache_get", side_effect=probes.get), + patch(f"{PARTITION_MAPPING}._cache_set", side_effect=probes.__setitem__), + ): + # Nothing probed yet, so the API has no refusal to report. + cold_summary = table.partition_filter_mapping_summary + assert cold_summary is not None + assert cold_summary["safety_refusal"] is None + # Elsewhere a raw epoch column is an ordinary index, so it still mirrors. + assert "dt_epoch" in _query(table, **arguments) + with patch.object( + Database, + "db_engine_spec", + new_callable=PropertyMock, + return_value=HiveEngineSpec, + ): + mirrored_sql = _query(table, **arguments) + preview = preview_partition_mapping( + table, + mapped_column="event_time", + value_transform=transform, + sample_values=[value], + ) + summary = table.partition_filter_mapping_summary + table.partition_column = None + unmirrored_sql = _query(table, **arguments) + assert "dt_epoch" not in mirrored_sql + assert connection.execute(mirrored_sql).fetchall() == [("38000",)] + assert connection.execute(unmirrored_sql).fetchall() == [("38000",)] + assert preview["reason"] == "unbucketed_epoch" + # The API reports the refusal the probe found, not only the editor. + assert summary is not None + assert summary["safety_refusal"]["reason"] == "unbucketed_epoch" + connection.close() + + +def test_a_text_layout_the_engine_rejects_does_not_hide_the_others() -> None: + """ + An engine raising on one text layout fails the batched canary probe; each + layout is then asked alone, so the one the transform parses still counts. + """ + from superset.connectors.sqla import partition_mapping + + canaries = ["a", "b", "c", "d"] + + def probe(database: Any, catalog: Any, schema: Any, transform: str, values: Any): + if values == canaries or values == ["a", "b"]: + return None + return [100, 100 + 2843] + + with patch.object(partition_mapping, "_probe", side_effect=probe): + answers = partition_mapping._probe_canaries(MagicMock(), "t(:value)", canaries) + assert answers == [None, None, 100, 2943] + assert partition_mapping._answers_raw_instants(answers) + + with patch.object(partition_mapping, "_probe", return_value=None): + assert ( + partition_mapping._probe_canaries(MagicMock(), "t(:value)", canaries) + is None + ) From 91cfb55896f2fad98cfc71643534227b7385708a Mon Sep 17 00:00:00 2001 From: Hugh A Miles II Date: Thu, 29 Oct 2026 20:02:45 -0400 Subject: [PATCH 09/11] fix(partition-mapping): address the rest of QA's rerun findings From QA's rerun of #45846 on Hive and Impala: - N-FIX-02: an ordinary comment in a transform (`-- hourly`) made every probe decline with a "not a plain projection" warning. The probe gate rejects any comment in the compiled SQL, since that is how a bound value hides what follows it. Comments the owner wrote are now removed with the engine's own lexer before the probe compiles. A `:value` inside a comment is still refused as stored. - A transform the mapping refuses could get a green "Matched" from Validate when the chosen keys only held hour-boundary rows. Validate now reports it as refused and reads no rows. - VAL-2: an inconclusive result names the partition keys at fault. - VAL-4: partition keys must be 64-bit integers. A trailing newline no longer passes the `$` anchor, and the UI and the API agree on length. - VAL-5: a disabled Validate button says why, and "1 partition" is singular. - VAL-6: a refused mapping no longer says its filters are mirrored above "Filters will not be mirrored". - O-REG-01: Validate is not offered for a text partition key. Co-Authored-By: Claude Opus 5.5 --- .../partition-filter-mapping.mdx | 12 +- docs/static/resources/openapi.json | 4 +- .../PartitionColumnFields.tsx | 10 +- .../PartitionDataValidation.test.tsx | 66 ++++++++++- .../PartitionDataValidation.tsx | 49 ++++++-- .../PartitionFilterMapping.test.tsx | 88 ++++++++++++++ .../PartitionMappingSection.tsx | 62 ++++++---- .../PartitionFilterMapping/types.ts | 6 +- .../PartitionFilterMapping/utils.ts | 5 + superset/connectors/sqla/models.py | 6 +- superset/connectors/sqla/partition_mapping.py | 74 ++++++++---- .../connectors/sqla/partition_validation.py | 107 +++++++++++------- superset/datasets/schemas.py | 24 +++- superset/sql/parse.py | 41 +++++++ .../translations/ar/LC_MESSAGES/messages.po | 69 ++++++++++- .../translations/ca/LC_MESSAGES/messages.po | 65 ++++++++++- .../translations/cs/LC_MESSAGES/messages.po | 66 ++++++++++- .../translations/de/LC_MESSAGES/messages.po | 65 ++++++++++- .../translations/en/LC_MESSAGES/messages.po | 65 ++++++++++- .../translations/es/LC_MESSAGES/messages.po | 65 ++++++++++- .../translations/fa/LC_MESSAGES/messages.po | 65 ++++++++++- .../translations/fi/LC_MESSAGES/messages.po | 65 ++++++++++- .../translations/fr/LC_MESSAGES/messages.po | 65 ++++++++++- .../translations/it/LC_MESSAGES/messages.po | 65 ++++++++++- .../translations/ja/LC_MESSAGES/messages.po | 64 ++++++++++- .../translations/ko/LC_MESSAGES/messages.po | 64 ++++++++++- .../translations/lv/LC_MESSAGES/messages.po | 66 ++++++++++- superset/translations/messages.pot | 39 ++++++- .../translations/mi/LC_MESSAGES/messages.po | 65 ++++++++++- .../translations/nl/LC_MESSAGES/messages.po | 65 ++++++++++- .../translations/pl/LC_MESSAGES/messages.po | 65 ++++++++++- .../translations/pt/LC_MESSAGES/messages.po | 65 ++++++++++- .../pt_BR/LC_MESSAGES/messages.po | 65 ++++++++++- .../translations/ro/LC_MESSAGES/messages.po | 66 ++++++++++- .../translations/ru/LC_MESSAGES/messages.po | 66 ++++++++++- .../translations/sk/LC_MESSAGES/messages.po | 66 ++++++++++- .../translations/sl/LC_MESSAGES/messages.po | 67 ++++++++++- .../translations/sr/LC_MESSAGES/messages.po | 66 ++++++++++- .../sr_Latn/LC_MESSAGES/messages.po | 66 ++++++++++- .../translations/ta/LC_MESSAGES/messages.po | 65 ++++++++++- .../translations/th/LC_MESSAGES/messages.po | 64 ++++++++++- .../translations/tr/LC_MESSAGES/messages.po | 64 ++++++++++- .../translations/uk/LC_MESSAGES/messages.po | 67 ++++++++++- .../translations/zh/LC_MESSAGES/messages.po | 64 ++++++++++- .../zh_TW/LC_MESSAGES/messages.po | 64 ++++++++++- .../sqla/partition_validation_test.py | 41 +++++++ tests/unit_tests/datasets/schema_tests.py | 32 +++++- .../models/partition_mirroring_test.py | 6 +- tests/unit_tests/sql/parse_tests.py | 26 +++++ 49 files changed, 2365 insertions(+), 292 deletions(-) diff --git a/docs/admin_docs/configuration/partition-filter-mapping.mdx b/docs/admin_docs/configuration/partition-filter-mapping.mdx index 938043133ef0..90fc76e9ba7f 100644 --- a/docs/admin_docs/configuration/partition-filter-mapping.mdx +++ b/docs/admin_docs/configuration/partition-filter-mapping.mdx @@ -114,7 +114,8 @@ The automatic preview reports **Expression evaluated — data not checked**. Thi Superset could evaluate the expression and build a predicate, not that it matches your data. For a physical dataset with a numeric epoch key, enter one to three **existing partition -keys**, then choose **Validate against data**. Superset reads at most 50 rows from each +keys** (whole numbers within the 64-bit range), then choose **Validate against data**. The +section is not shown for a text partition key, and a disabled button says what is missing. Superset reads at most 50 rows from each selected partition and compares each transformed business value with that same row's stored key. It applies your data-access permissions and row-level security. It does not run a total-count query or infer sample partitions from the candidate expression. @@ -123,8 +124,11 @@ run a total-count query or infer sample partitions from the candidate expression evidence about that sample, not proof for all rows, backfills, or future ingestion. - **Partition mismatch found** shows the business value, stored key, and transform output. An output found in another partition still fails the same-row comparison. -- **Validation inconclusive** means a selected partition had no checkable rows or an +- **Validation inconclusive** names each selected key that had no checkable rows or whose evaluation/query failed. NULL business values cannot establish a match. +- **Filters will not be mirrored** means the mapping itself refuses the transform, for + example one that answers raw epoch instants. No rows are sampled: rows on the hour + boundary would match it exactly and report a transform the mirror declines as matching. Choose partitions containing off-boundary business timestamps, such as 10:47:23, and repeat across relevant dates and timezone transitions. The read is restricted to the selected keys; @@ -374,6 +378,10 @@ refused when you save: PostgreSQL large-object writer. The transform is evaluated against the engine to check that it mirrors, and that evaluation is cached and repeated, so it has to be a read. +An ordinary comment that does not swallow `:value`, such as +`floor(unix_timestamp(:value) / 3600) * 3600 -- hourly`, is allowed. Superset removes it +before evaluating the transform. + Only the mapped column may carry a transform. Setting one on any other column through the API, or in an import bundle, has no effect: Superset drops it on write, because a value parked on a column the mapping does not mirror is invisible in the editor and would go live the moment the mapped diff --git a/docs/static/resources/openapi.json b/docs/static/resources/openapi.json index e38bb28b2587..88b82264068d 100644 --- a/docs/static/resources/openapi.json +++ b/docs/static/resources/openapi.json @@ -8541,9 +8541,7 @@ "default": null, "description": "One to three existing integer partition keys for explicit data validation", "items": { - "maxLength": 21, - "minLength": 1, - "pattern": "^-?[0-9]+$", + "pattern": "^-?[0-9]{1,19}$", "type": "string" }, "maxItems": 3, diff --git a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionColumnFields.tsx b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionColumnFields.tsx index 8d55f67f1d82..3215bcca2c4e 100644 --- a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionColumnFields.tsx +++ b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionColumnFields.tsx @@ -260,9 +260,13 @@ export default function PartitionColumnFields({ )} - {t( - 'Filters on this column are mirrored onto the partition column.', - )} + {isActive + ? t( + 'Filters on this column are mirrored onto the partition column.', + ) + : t( + 'Filters on this column are mapped onto the partition column, but are not mirrored.', + )} {differentColumnTarget && ( <> {' '} diff --git a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.test.tsx b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.test.tsx index 8d1aa58144de..fa2e0aa9552e 100644 --- a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.test.tsx +++ b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.test.tsx @@ -36,7 +36,6 @@ const props = { isMonotonic: true, sampleValues: ['2026-01-15 10:47:23'], operator: '>=', - disabled: false, }; afterEach(() => fetchMock.clearHistory().removeRoutes()); @@ -97,7 +96,7 @@ test('changing a candidate clears sampled success', async () => { screen.getByRole('button', { name: 'Validate against data' }), ); expect( - await screen.findByText('Matched 50 sampled rows across 1 partitions'), + await screen.findByText('Matched 50 sampled rows across 1 partition'), ).toBeInTheDocument(); rerender( { test('empty, invalid, and excessive partition selections cannot run', () => { render(); - for (const value of ['', 'abc', '1,2,3,4']) { + for (const value of [ + '', + 'abc', + '1,2,3,4', + '12345678901234567890', + '9223372036854775808', + ]) { fireEvent.change(screen.getByRole('textbox'), { target: { value } }); expect( screen.getByRole('button', { name: 'Validate against data' }), ).toBeDisabled(); + expect( + screen.getByTestId('partition-validation-disabled'), + ).toBeInTheDocument(); } + fireEvent.change(screen.getByRole('textbox'), { + target: { value: '-9223372036854775808, 9223372036854775807' }, + }); + expect( + screen.getByRole('button', { name: 'Validate against data' }), + ).toBeEnabled(); + expect( + screen.queryByTestId('partition-validation-disabled'), + ).not.toBeInTheDocument(); +}); + +test('a disabled button says why', () => { + render( + , + ); + fireEvent.change(screen.getByRole('textbox'), { + target: { value: '1768471200' }, + }); + expect( + screen.getByRole('button', { name: 'Validate against data' }), + ).toBeDisabled(); + expect( + screen.getByText( + 'Correct the value transform before validating against data.', + ), + ).toBeInTheDocument(); +}); + +test('a refused transform is never reported as matched', async () => { + fetchMock.post(endpoint, { + result: { + valid: false, + data_validation: { + status: 'refused', + message: 'Filters will not be mirrored.', + }, + }, + }); + render(); + fireEvent.change(screen.getByRole('textbox'), { + target: { value: '1768471200' }, + }); + await userEvent.click( + screen.getByRole('button', { name: 'Validate against data' }), + ); + expect( + await screen.findByText('Filters will not be mirrored'), + ).toBeInTheDocument(); + expect(screen.queryByText(/Matched/)).not.toBeInTheDocument(); }); diff --git a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.tsx b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.tsx index 703e7a864cc2..eabda4680bdb 100644 --- a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.tsx +++ b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.tsx @@ -19,7 +19,7 @@ import { useEffect, useRef, useState } from 'react'; import { SupersetClient, getClientErrorObject } from '@superset-ui/core'; -import { t } from '@apache-superset/core/translation'; +import { t, tn } from '@apache-superset/core/translation'; import { Alert } from '@apache-superset/core/components'; import { Button, Flex, Input, Typography } from '@superset-ui/core/components'; import type { @@ -35,7 +35,20 @@ interface Props { isMonotonic: boolean; sampleValues: string[]; operator: string; - disabled: boolean; + /** Why the mapping cannot be validated yet, if it cannot. */ + disabledReason?: string; +} + +const INT64_MIN = -(BigInt(2) ** BigInt(63)); +const INT64_MAX = BigInt(2) ** BigInt(63) - BigInt(1); + +/** A 64-bit integer written as plain digits, as the API accepts it. */ +function isPartitionKey(key: string): boolean { + return ( + /^-?[0-9]{1,19}$/.test(key) && + BigInt(key) >= INT64_MIN && + BigInt(key) <= INT64_MAX + ); } /** Explicitly check actual row pairs; never scan a table while typing a transform. */ @@ -57,8 +70,18 @@ export default function PartitionDataValidation(props: Props) { }; }, [identity]); const values = keys.split(',').map(key => key.trim()); - const keysValid = - values.length <= 3 && values.every(key => /^-?[0-9]{1,20}$/.test(key)); + const keysValid = values.length <= 3 && values.every(isPartitionKey); + const disabledReason = + props.disabledReason ?? + (!props.datasetId + ? t('Save the dataset before validating against data.') + : !keys.trim() + ? t('Enter one to three existing partition keys.') + : !keysValid + ? t( + 'Partition keys must be whole numbers within the 64-bit range, up to three.', + ) + : undefined); const validate = async () => { requestId.current += 1; @@ -119,18 +142,28 @@ export default function PartitionDataValidation(props: Props) { + {disabledReason && ( + + {disabledReason} + + )} {visible && ( diff --git a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionFilterMapping.test.tsx b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionFilterMapping.test.tsx index ca4726223810..7d435dcb5fae 100644 --- a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionFilterMapping.test.tsx +++ b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionFilterMapping.test.tsx @@ -449,6 +449,94 @@ test('a failed preview shows the error instead of a predicate', async () => { ).not.toBeInTheDocument(); }); +test('a refused transform is not described as mirrored', async () => { + fetchMock.post(PREVIEW_URL, { + result: { + valid: false, + reason: 'unbucketed_epoch', + error: 'Raw epoch conversion does not specify the partition bucket.', + }, + }); + + render( + , + ); + + expect( + await screen.findByText('Filters will not be mirrored'), + ).toBeInTheDocument(); + expect( + screen.queryByText( + 'Filters on this column are mirrored onto the partition field.', + ), + ).not.toBeInTheDocument(); + expect(screen.getByText(/this transform is refused/)).toBeInTheDocument(); +}); + +test('the column banner does not call a refused mapping mirrored', () => { + render( + , + ); + + expect( + screen.queryByText( + 'Filters on this column are mirrored onto the partition column.', + ), + ).not.toBeInTheDocument(); +}); + +test('data validation is offered only for a numeric partition key', () => { + const renderWith = (type: string) => + render( + , + ); + + const { unmount } = renderWith('VARCHAR'); + expect( + screen.queryByRole('button', { name: 'Validate against data' }), + ).not.toBeInTheDocument(); + unmount(); + renderWith('BIGINT'); + expect( + screen.getByRole('button', { name: 'Validate against data' }), + ).toBeInTheDocument(); +}); + test('only the mapped row publishes a preview verdict', async () => { // Every expanded column renders this component and they all report to the // same `onPreviewVerdict`, but only the mapped one previews anything diff --git a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionMappingSection.tsx b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionMappingSection.tsx index 8f6784e05f53..5bc7c1454fc3 100644 --- a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionMappingSection.tsx +++ b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionMappingSection.tsx @@ -35,6 +35,7 @@ import { useDebouncedCommit } from './useDebouncedCommit'; import { usePartitionMappingPreview } from './usePartitionMappingPreview'; import { defaultTransformFor, + isNumericType, partitionRowState, previewOperatorFor, sampleValuesFor, @@ -182,6 +183,17 @@ export default function PartitionMappingSection({ // message appears as it is typed. The same check gates Save from // `DatasourceEditor.validate`, reading the committed record instead. const transformErrors = valueTransformIssues(item, transform); + // A refusal the preview reported, so the copy above it stops promising the + // mirror the alert below withdraws. + const refused = Boolean( + !loading && preview && !preview.valid && preview.reason !== 'unsaved', + ); + // Data validation compares integer keys. On a text key it can never be + // enabled, so it is not offered; an unknown type keeps it, as before. + const partitionType = datasource.columns?.find( + col => col.column_name === datasource.partition_column, + )?.type; + const validatesData = !partitionType || isNumericType(partitionType); return ( - {isTemporal - ? t('Filters on this column are mirrored onto the partition field.') - : t( - 'This column holds the mapping instead of the default datetime column.', - )} + {refused + ? t( + 'Filters on this column are mapped onto the partition field, but this transform is refused, so they are not mirrored.', + ) + : isTemporal + ? t('Filters on this column are mirrored onto the partition field.') + : t( + 'This column holds the mapping instead of the default datetime column.', + )} @@ -353,20 +369,28 @@ export default function PartitionMappingSection({ )} - 0 || - preview?.reason === 'unsaved' - } - /> + {validatesData && ( + 0 + ? t( + 'Correct the value transform before validating against data.', + ) + : preview?.reason === 'unsaved' + ? t('Save the dataset before validating against data.') + : undefined + } + /> + )} {/* Only one of preview and error is ever visible. */} {!loading && preview && !preview.valid && ( dict[str, Any] | None: transform = mapped_column.partition_value_transform if mapped_column else None safety_refusal = epoch_mapping_refusal( self, mapped_column_name, self.partition_column, transform - ) or cached_raw_instant_refusal( - self, mapped_column_name, self.partition_column, transform + ) or raw_instant_refusal( + self, mapped_column_name, self.partition_column, transform, probe=False ) active = bool( not safety_refusal diff --git a/superset/connectors/sqla/partition_mapping.py b/superset/connectors/sqla/partition_mapping.py index 8a4eb6535700..fb91e3dc77b7 100644 --- a/superset/connectors/sqla/partition_mapping.py +++ b/superset/connectors/sqla/partition_mapping.py @@ -205,7 +205,7 @@ SupersetSecurityException, ) from superset.extensions import cache_manager, feature_flag_manager -from superset.sql.parse import SQLScript, SQLStatement +from superset.sql.parse import SQLScript, SQLStatement, strip_comments from superset.superset_typing import FilterValues from superset.utils import core as utils, json from superset.utils.core import FilterOperator, get_username @@ -1241,7 +1241,7 @@ def _canary_answers( datasource: SqlaTable, mapped_column: str, partition_column: TableColumn, - mapping: PartitionMapping, + transform: str, ) -> list[Any] | None: """ The transform's answers at the canaries, or ``None`` when not applicable. @@ -1260,12 +1260,12 @@ def _canary_answers( database, datasource.catalog, datasource.schema, - mapping.value_transform, + transform, canaries, ) answers = _cache_get(key) if answers is None: - answers = _probe_canaries(datasource, mapping.value_transform, canaries) + answers = _probe_canaries(datasource, transform, canaries) # A failure is not cached: a transient blip must not switch the check # off for the whole cache timeout. if answers is not None: @@ -1273,18 +1273,22 @@ def _canary_answers( return answers -def cached_raw_instant_refusal( +def raw_instant_refusal( datasource: SqlaTable, mapped_column: str | None, partition_column: str | None, transform: str | None, + *, + probe: bool, ) -> dict[str, str] | None: """ - The raw-instant refusal, as far as an earlier probe already answered it. + The refusal of a transform that answers raw epoch instants, if it does. - Reads the canary cache and never probes, so the dataset API can report a - transform the engine was seen to refuse without a round trip per request; - ``None`` on a cold cache, as ``evaluable`` is. + With ``probe`` false only the canary cache is read, so the dataset API can + report a transform the engine was seen to refuse without a round trip per + request -- ``None`` on a cold cache, as ``evaluable`` is. Data validation + probes, so a sample of rows on the hour boundary cannot report a transform + the mirror declines as matching. """ target = next( (col for col in datasource.columns if col.column_name == partition_column), @@ -1292,17 +1296,24 @@ def cached_raw_instant_refusal( ) if not transform or not mapped_column or target is None: return None - canaries = _epoch_canaries(datasource, mapped_column, target) - if not canaries: - return None - key = _probe_cache_key( - datasource.database, - datasource.catalog, - datasource.schema, - transform, - canaries, - ) - if not _answers_raw_instants(_cache_get(key)): + if probe: + answers = _canary_answers(datasource, mapped_column, target, transform) + else: + canaries = _epoch_canaries(datasource, mapped_column, target) + answers = ( + _cache_get( + _probe_cache_key( + datasource.database, + datasource.catalog, + datasource.schema, + transform, + canaries, + ) + ) + if canaries + else None + ) + if not _answers_raw_instants(answers): return None return { "reason": "unbucketed_epoch", @@ -1354,7 +1365,12 @@ def _declined_as_raw_instants( ) -> bool: """Whether to decline because the transform answers raw epoch instants.""" if not _answers_raw_instants( - _canary_answers(datasource, mapping.mapped_column, partition_column, mapping) + _canary_answers( + datasource, + mapping.mapped_column, + partition_column, + mapping.value_transform, + ) ): return False logger.warning( @@ -2343,10 +2359,24 @@ def _probe( ) return None + # After the gate above, which reads the transform as stored -- a `:value` + # inside a comment is refused there, not silently dropped here. A comment + # the owner wrote is inert, but `probe_sql_is_evaluable` refuses any comment + # in the compiled probe, since that is how a bound value hides what + # follows it; so it is removed before compiling, and a comment the gate + # still finds can only have come from a value. + stripped = strip_comments(transform, database.backend) + if stripped is None: + logger.warning( + "Partition transform could not be read with its comments removed; " + "queries will not prune" + ) + return None + try: from_suffix = database.db_engine_spec.select_without_from_suffix sql = build_probe_sql( - transform, + stripped, distinct, _dialect_for(database), from_suffix, diff --git a/superset/connectors/sqla/partition_validation.py b/superset/connectors/sqla/partition_validation.py index 72981c972b9a..b286a73aeeec 100644 --- a/superset/connectors/sqla/partition_validation.py +++ b/superset/connectors/sqla/partition_validation.py @@ -18,7 +18,7 @@ from __future__ import annotations -from typing import Any, TYPE_CHECKING +from typing import Any, cast, TYPE_CHECKING import pandas as pd from flask_babel import gettext as _ @@ -28,8 +28,10 @@ _declined_for_reading_by_type, _native_generic_type, _to_python_scalar, + epoch_mapping_refusal, evaluate_transform, has_active_advanced_data_type, + raw_instant_refusal, stored_expression_error, validate_partition_mapping, ) @@ -63,38 +65,13 @@ def validate_partition_data( "examples": [], } target_name = partition_column or datasource.partition_column - columns = {col.column_name: col for col in datasource.columns} - source = columns.get(mapped_column) - target = columns.get(target_name) - if ( - datasource.sql - or source is None - or target is None - or source.expression - or target.expression - or has_active_advanced_data_type(source) - or _native_generic_type(target) != GenericDataType.NUMERIC - ): - result["message"] = _( - "Data validation requires physical columns and a numeric partition key." - ) - return result - issues = validate_partition_mapping( - column_names=set(columns), - partition_column=target_name, - partition_mapped_column=mapped_column, - main_dttm_col=datasource.main_dttm_col, - transform=value_transform, - engine=datasource.database.backend, - ) - if issues or not value_transform: - result["message"] = _("Correct the mapping expression before validating data.") - return result - if error := stored_expression_error( - datasource.database, datasource.catalog, datasource.schema, value_transform + if declined := _declined_before_sampling( + datasource, mapped_column, target_name, value_transform ): - result["message"] = str(error) + result["status"], result["message"] = declined return result + # Declined above when empty. + transform = cast(str, value_transform) keys = remove_duplicates(int(value) for value in partition_values) result["partitions_requested"] = len(keys) @@ -114,15 +91,15 @@ def validate_partition_data( ) # Editorship alone does not authorize reading the underlying data. context.raise_for_access() - failed = False - for query in context.queries: + failed_keys: list[int] = [] + for key, query in zip(keys, context.queries, strict=True): try: # The raw datasource result retains exact integers and stored # timestamps, before display offsets/JSON datetime normalization. # Query assembly retains RLS; no chart cache or COUNT(*) is used. sample = datasource.query(query.to_dict()) if sample.status != QueryStatus.SUCCESS: - failed = True + failed_keys.append(key) continue pairs = [ (_to_python_scalar(value), _to_python_scalar(key)) @@ -130,28 +107,80 @@ def validate_partition_data( .head(50) .itertuples(index=False, name=None) ] - if _check_row_pairs(datasource, value_transform, pairs, result): + if _check_row_pairs(datasource, transform, pairs, result): result["partitions_checked"] += 1 else: - failed = True + failed_keys.append(key) except Exception: # pylint: disable=broad-except # Never turn an engine failure or incomplete sample into success. - failed = True + failed_keys.append(key) if result["mismatch_count"]: result["status"] = "mismatch" result["message"] = _("The transform does not match the stored partition keys.") - elif not failed and result["partitions_checked"] == len(keys): + elif not failed_keys and result["partitions_checked"] == len(keys): result["status"] = "matched" result["message"] = _( "The transform matched the sampled rows, not the entire dataset." ) else: + result["inconclusive_keys"] = [str(key) for key in failed_keys] result["message"] = _( - "Some partitions had no checkable rows, or the query or transform failed." + "No checkable rows, or the query or transform failed, for partition " + "keys: %(keys)s.", + keys=", ".join(result["inconclusive_keys"]), ) return result +def _declined_before_sampling( + datasource: SqlaTable, + mapped_column: str, + target_name: str | None, + value_transform: str | None, +) -> tuple[str, str] | None: + """The status and message when no rows should be read, else ``None``.""" + columns = {col.column_name: col for col in datasource.columns} + source = columns.get(mapped_column) + target = columns.get(target_name) if target_name else None + if ( + datasource.sql + or source is None + or target is None + or source.expression + or target.expression + or has_active_advanced_data_type(source) + or _native_generic_type(target) != GenericDataType.NUMERIC + ): + return "inconclusive", _( + "Data validation requires physical columns and a numeric partition key." + ) + issues = validate_partition_mapping( + column_names=set(columns), + partition_column=target_name, + partition_mapped_column=mapped_column, + main_dttm_col=datasource.main_dttm_col, + transform=value_transform, + engine=datasource.database.backend, + ) + if issues or not value_transform: + return "inconclusive", _( + "Correct the mapping expression before validating data." + ) + if error := stored_expression_error( + datasource.database, datasource.catalog, datasource.schema, value_transform + ): + return "inconclusive", str(error) + # Rows on the hour boundary match a raw-instant transform exactly, so a + # sample could report as matched a transform the mirror refuses. + if refusal := epoch_mapping_refusal( + datasource, mapped_column, target_name, value_transform + ) or raw_instant_refusal( + datasource, mapped_column, target_name, value_transform, probe=True + ): + return "refused", refusal["message"] + return None + + def _check_row_pairs( datasource: SqlaTable, transform: str, diff --git a/superset/datasets/schemas.py b/superset/datasets/schemas.py index 73742d1d5c34..d3372655aceb 100644 --- a/superset/datasets/schemas.py +++ b/superset/datasets/schemas.py @@ -14,6 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +import re from datetime import datetime from typing import Any from uuid import UUID @@ -97,6 +98,23 @@ def validate_d3format(value: str | None) -> None: ) +_PARTITION_KEY_RE = re.compile(r"-?[0-9]{1,19}") + + +def validate_partition_key(value: str) -> None: + """ + A 64-bit integer partition key, written as plain digits. + + `re.fullmatch` rather than a ``$`` anchor, which also matches before a + trailing newline; and bounded to the 64-bit range, so a key no partition + column can hold is refused here rather than sent to the engine. + """ + if not _PARTITION_KEY_RE.fullmatch(value) or not (-(2**63) <= int(value) < 2**63): + raise ValidationError( + _("A partition key must be a whole number within the 64-bit range.") + ) + + class ResolveIsCertifiedMixin(Schema): """ ``is_certified`` is derived from ``certified_by``/``certification_details``. @@ -637,7 +655,11 @@ class PartitionMappingPreviewSchema(Schema): }, ) validation_partition_values = fields.List( - fields.String(validate=[Length(1, 21), Regexp(r"^-?[0-9]+$")]), + fields.String( + # The pattern documents the shape in the spec; the validator + # enforces it, without the trailing newline `$` lets through. + validate=[Regexp(r"^-?[0-9]{1,19}$"), validate_partition_key] + ), load_default=None, validate=Length(1, 3), metadata={ diff --git a/superset/sql/parse.py b/superset/sql/parse.py index 4bb55836c211..1537402bca25 100644 --- a/superset/sql/parse.py +++ b/superset/sql/parse.py @@ -268,6 +268,47 @@ def has_aggregate( ) +def strip_comments(sql: str, engine: str = "base") -> str | None: + """ + ``sql`` with its comments removed and every other character as written. + + Read off the engine's own lexer, so a comment marker inside a string literal + is data and stays. A comment between two tokens becomes one space, so it + cannot join them; one before the first token or after the last is dropped. + Returns ``None`` when the text does not tokenize, or when what is left does + not lex to the same tokens with no comment -- the text is never guessed at. + """ + dialect = SQLGLOT_DIALECTS.get(engine) + try: + lexer = Dialect.get_or_raise(dialect) + tokens = lexer.tokenize(sql) + except Exception: # pylint: disable=broad-except + return None + if not tokens: + return sql + pieces = [] + previous_end = -1 + for token in tokens: + gap = sql[previous_end + 1 : token.start] + if gap.strip(): + gap = " " if previous_end >= 0 else "" + pieces.append(gap) + pieces.append(sql[token.start : token.end + 1]) + previous_end = token.end + tail = sql[previous_end + 1 :] + pieces.append("" if tail.strip() else tail) + stripped = "".join(pieces) + try: + relexed = lexer.tokenize(stripped) + except Exception: # pylint: disable=broad-except + return None + if any(token.comments for token in relexed) or [ + (token.token_type, token.text) for token in relexed + ] != [(token.token_type, token.text) for token in tokens]: + return None + return stripped + + def is_constant_expression(expression: str, engine: str = "base") -> bool: """ Return True if the SQL expression is a bare constant: a string or numeric diff --git a/superset/translations/ar/LC_MESSAGES/messages.po b/superset/translations/ar/LC_MESSAGES/messages.po index 0004f7e66dff..d9b8942fe8b8 100644 --- a/superset/translations/ar/LC_MESSAGES/messages.po +++ b/superset/translations/ar/LC_MESSAGES/messages.po @@ -24,7 +24,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2024-07-14 15:10+0300\n" "Last-Translator: Abdalrahim G. Fakhouri \n" "Language: ar\n" @@ -1390,6 +1390,9 @@ msgstr "سيتم إنشاء مخطط جديد." msgid "A new dashboard will be created." msgstr "سيتم إنشاء لوحة معلومات جديدة." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5384,6 +5387,9 @@ msgstr "الشعاع الداخلي" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "الارتباط" @@ -7990,6 +7996,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "ما إذا كنت تريد ملء الكائنات" +msgid "Enter a value transform before validating against data." +msgstr "" + #, fuzzy msgid "Enter alert name" msgstr "اسم التنبيه" @@ -8009,6 +8018,9 @@ msgstr "أدخل اسم المجموعة" msgid "Enter minimum and maximum values for the range filter" msgstr "أدخل القيم الدنيا والقصوى لفلتر النطاق" +msgid "Enter one to three existing partition keys." +msgstr "" + #, fuzzy msgid "Enter report name" msgstr "اسم التقرير" @@ -9067,6 +9079,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -11277,8 +11299,14 @@ msgid "Match type" msgstr "نوع البيانات" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] @@ -12096,6 +12124,12 @@ msgstr "لا توجد فلاتر متاحة." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -13102,6 +13136,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -15040,6 +15077,9 @@ msgstr "" msgid "Save query" msgstr "حفظ الاستعلام" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -16693,9 +16733,6 @@ msgstr "تعذّر حل بعض المجموعات وتُعرض كمعرّفات. msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -18594,6 +18631,12 @@ msgstr "" msgid "The report has been created" msgstr "تم إنشاء التقرير" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + #, fuzzy msgid "The report will be sent to your email at" msgstr "سيتم إرسال لقطة شاشة للوحة القيادة إلى بريدك الإلكتروني على" @@ -18945,6 +18988,13 @@ msgstr "تم حفظ لوحة المعلومات هذه بنجاح." msgid "The user has been updated successfully." msgstr "تم حفظ لوحة المعلومات هذه بنجاح." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + #, fuzzy msgid "The user was updated successfully" msgstr "تم حفظ لوحة المعلومات هذه بنجاح." @@ -19944,6 +19994,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/ca/LC_MESSAGES/messages.po b/superset/translations/ca/LC_MESSAGES/messages.po index 84525d5fd9dc..ff629f156720 100644 --- a/superset/translations/ca/LC_MESSAGES/messages.po +++ b/superset/translations/ca/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2025-06-27 12:56+0200\n" "Last-Translator: FULL NAME \n" "Language: ca\n" @@ -1241,6 +1241,9 @@ msgstr "Es crearà un nou gràfic." msgid "A new dashboard will be created." msgstr "Es crearà un nou dashboard." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5171,6 +5174,9 @@ msgstr "Radi de Cantonada" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Correlació" @@ -7665,6 +7671,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Si omplir els objectes" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Introdueix nom de l'alerta" @@ -7683,6 +7692,9 @@ msgstr "Introduïu el nom del grup" msgid "Enter minimum and maximum values for the range filter" msgstr "Introduïu els valors mínim i màxim per al filtre de rang" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Introdueix nom de l'informe" @@ -8701,6 +8713,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10868,8 +10890,10 @@ msgid "Match type" msgstr "Tipus de dades" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] @@ -11654,6 +11678,12 @@ msgstr "Cap filtre disponible." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12657,6 +12687,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -14524,6 +14557,9 @@ msgstr "" msgid "Save query" msgstr "Desar consulta" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -16152,9 +16188,6 @@ msgstr "Alguns grups no s'han pogut resoldre i es mostren com a IDs." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -18028,6 +18061,12 @@ msgstr "" msgid "The report has been created" msgstr "L'informe s'ha creat" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "L'informe s'enviarà al teu correu electrònic a" @@ -18371,6 +18410,13 @@ msgstr "Aquest dashboard s'ha desat amb èxit." msgid "The user has been updated successfully." msgstr "Aquest dashboard s'ha desat amb èxit." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + #, fuzzy msgid "The user was updated successfully" msgstr "Aquest dashboard s'ha desat amb èxit." @@ -19370,6 +19416,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/cs/LC_MESSAGES/messages.po b/superset/translations/cs/LC_MESSAGES/messages.po index 498982faed9e..e2b7823c5327 100644 --- a/superset/translations/cs/LC_MESSAGES/messages.po +++ b/superset/translations/cs/LC_MESSAGES/messages.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2016-05-02 08:49-0700\n" "Last-Translator: Jan Šmejkal \n" "Language: cs\n" @@ -1250,6 +1250,9 @@ msgstr "Bude vytvořen nový graf." msgid "A new dashboard will be created." msgstr "Bude vytvořena nová nástěnka." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5016,6 +5019,9 @@ msgstr "Poloměr rohu" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Korelace" @@ -7438,6 +7444,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Zadejte část názvu objektu" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Zadejte název upozornění" @@ -7453,6 +7462,9 @@ msgstr "Zadejte název skupiny" msgid "Enter minimum and maximum values for the range filter" msgstr "Zadejte minimální a maximální hodnoty pro filtr rozsahu" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Zadejte název reportu" @@ -8431,6 +8443,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10514,8 +10536,11 @@ msgid "Match type" msgstr "Datový typ" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" msgid "Matrixify" msgstr "Matrixify" @@ -11280,6 +11305,12 @@ msgstr "Nejsou k dispozici žádné filtry." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12264,6 +12295,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -14095,6 +14129,9 @@ msgstr "" msgid "Save query" msgstr "Uložit dotaz" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -15662,9 +15699,6 @@ msgstr "Některé skupiny nebylo možné rozlišit a zobrazují se jako ID." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -17458,6 +17492,12 @@ msgstr "" msgid "The report has been created" msgstr "Report byl vytvořen" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "Report bude odeslán na váš e-mail na adresu" @@ -17786,6 +17826,13 @@ msgstr "Uživatel byl úspěšně aktualizován." msgid "The user has been updated successfully." msgstr "Uživatel byl úspěšně aktualizován." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "Uživatel byl úspěšně aktualizován" @@ -18735,6 +18782,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/de/LC_MESSAGES/messages.po b/superset/translations/de/LC_MESSAGES/messages.po index 982cad5fb4cd..efb09d94d555 100644 --- a/superset/translations/de/LC_MESSAGES/messages.po +++ b/superset/translations/de/LC_MESSAGES/messages.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2023-04-07 19:45+0200\n" "Last-Translator: Holger Bruch \n" "Language: de\n" @@ -1204,6 +1204,9 @@ msgstr "Es wird ein neues Diagramm erstellt." msgid "A new dashboard will be created." msgstr "Es wird ein neues Dashboard erstellt." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -4948,6 +4951,9 @@ msgstr "Eckenradius" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Korrelation" @@ -7291,6 +7297,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Geben Sie einen Teil des Objektnamens ein" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Name des Alarms eingeben" @@ -7306,6 +7315,9 @@ msgstr "Gruppennamen eingeben" msgid "Enter minimum and maximum values for the range filter" msgstr "Mindest- und Höchstwert für den Bereichsfilter eingeben" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Name des Berichts" @@ -8245,6 +8257,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10267,8 +10289,10 @@ msgid "Match type" msgstr "Vergleichstyp" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" msgid "Matrixify" msgstr "Matrixify" @@ -11009,6 +11033,12 @@ msgstr "Keine Filter verfügbar." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -11989,6 +12019,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -13784,6 +13817,9 @@ msgstr "" msgid "Save query" msgstr "Abfrage speichern" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -15264,9 +15300,6 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - msgid "Some permissions could not be resolved and are shown as IDs." msgstr "" "Einige Berechtigungen konnten nicht aufgelöst werden und werden als IDs " @@ -17070,6 +17103,12 @@ msgstr "" msgid "The report has been created" msgstr "Der Bericht wurde erstellt" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "Der Bericht wird an Ihre E-Mail-Adresse geschickt" @@ -17402,6 +17441,13 @@ msgstr "Der/Die Benutzer*in wurde erfolgreich erstellt." msgid "The user has been updated successfully." msgstr "Der/Die Benutzer*in wurde erfolgreich aktualisiert." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "Der/Die Benutzer*in wurde erfolgreich aktualisiert" @@ -18375,6 +18421,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/en/LC_MESSAGES/messages.po b/superset/translations/en/LC_MESSAGES/messages.po index 4b4a61b58967..133afcb1f532 100644 --- a/superset/translations/en/LC_MESSAGES/messages.po +++ b/superset/translations/en/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2016-05-02 08:49-0700\n" "Last-Translator: FULL NAME \n" "Language: en\n" @@ -1118,6 +1118,9 @@ msgstr "" msgid "A new dashboard will be created." msgstr "" +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -4561,6 +4564,9 @@ msgstr "" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "" @@ -6737,6 +6743,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "" @@ -6752,6 +6761,9 @@ msgstr "" msgid "Enter minimum and maximum values for the range filter" msgstr "" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "" @@ -7674,6 +7686,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -9590,8 +9612,10 @@ msgid "Match type" msgstr "" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" msgid "Matrixify" msgstr "" @@ -10306,6 +10330,12 @@ msgstr "" msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -11207,6 +11237,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -12921,6 +12954,9 @@ msgstr "" msgid "Save query" msgstr "" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -14288,9 +14324,6 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - msgid "Some permissions could not be resolved and are shown as IDs." msgstr "" @@ -15847,6 +15880,12 @@ msgstr "" msgid "The report has been created" msgstr "" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "" @@ -16130,6 +16169,13 @@ msgstr "" msgid "The user has been updated successfully." msgstr "" +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "" @@ -16965,6 +17011,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/es/LC_MESSAGES/messages.po b/superset/translations/es/LC_MESSAGES/messages.po index 972a1b2152ac..32020fab5a3e 100644 --- a/superset/translations/es/LC_MESSAGES/messages.po +++ b/superset/translations/es/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2016-05-02 08:49-0700\n" "Last-Translator: FULL NAME \n" "Language: es\n" @@ -1227,6 +1227,9 @@ msgstr "Se creará un nuevo gráfico." msgid "A new dashboard will be created." msgstr "Se creará un nuevo panel de control." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5114,6 +5117,9 @@ msgstr "Radio de la esquina" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Correlación" @@ -7582,6 +7588,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Si se deben rellenar los objetos" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Introduce el nombre de la alerta" @@ -7599,6 +7608,9 @@ msgstr "Introducir el nombre del grupo" msgid "Enter minimum and maximum values for the range filter" msgstr "Ingrese los valores mínimo y máximo para el filtro de rango" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Introduce el nombre del informe" @@ -8602,6 +8614,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10760,8 +10782,10 @@ msgid "Match type" msgstr "Tipo de datos" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: fr, ru] #, fuzzy @@ -11543,6 +11567,12 @@ msgstr "No hay filtros disponibles." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12546,6 +12576,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -14419,6 +14452,9 @@ msgstr "" msgid "Save query" msgstr "Guardar consulta" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -16013,9 +16049,6 @@ msgstr "Algunos grupos no pudieron resolverse y se muestran como IDs." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -17912,6 +17945,12 @@ msgstr "" msgid "The report has been created" msgstr "El informe se ha creado" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "El informe se enviará a tu dirección de correo electrónico" @@ -18258,6 +18297,13 @@ msgstr "Este panel de control se ha guardado correctamente." msgid "The user has been updated successfully." msgstr "Este panel de control se ha guardado correctamente." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + #, fuzzy msgid "The user was updated successfully" msgstr "Este panel de control se ha guardado correctamente." @@ -19261,6 +19307,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/fa/LC_MESSAGES/messages.po b/superset/translations/fa/LC_MESSAGES/messages.po index 8364d4f9cae1..d22e93458326 100644 --- a/superset/translations/fa/LC_MESSAGES/messages.po +++ b/superset/translations/fa/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2024-10-20 00:07+0330\n" "Last-Translator: Emad Rad \n" "Language: fa\n" @@ -1253,6 +1253,9 @@ msgstr "یک نمودار جدید ایجاد خواهد شد." msgid "A new dashboard will be created." msgstr "یک داشبورد جدید ایجاد خواهد شد." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5187,6 +5190,9 @@ msgstr "شعاع داخلی" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "همبستگی" @@ -7682,6 +7688,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "آیا اشیا را پر کنیم؟" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "نام هشدار را وارد کنید" @@ -7700,6 +7709,9 @@ msgstr "نام گروه را وارد کنید" msgid "Enter minimum and maximum values for the range filter" msgstr "مقادیر حداقل و حداکثر را برای فیلتر بازه وارد کنید" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "نام گزارش را وارد کنید" @@ -8741,6 +8753,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10935,8 +10957,10 @@ msgid "Match type" msgstr "نوع داده" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] @@ -11733,6 +11757,12 @@ msgstr "هیچ فیلتری موجود نیست." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12728,6 +12758,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -14623,6 +14656,9 @@ msgstr "" msgid "Save query" msgstr "ذخیره کوئری" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -16248,9 +16284,6 @@ msgstr "برخی گروه‌ها قابل حل‌وفصل نبودند و به msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -18124,6 +18157,12 @@ msgstr "" msgid "The report has been created" msgstr "گزارش ایجاد شده است" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "گزارش به ایمیل شما در تاریخ ارسال خواهد شد" @@ -18468,6 +18507,13 @@ msgstr "این داشبورد با موفقیت ذخیره شد." msgid "The user has been updated successfully." msgstr "این داشبورد با موفقیت ذخیره شد." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + #, fuzzy msgid "The user was updated successfully" msgstr "این داشبورد با موفقیت ذخیره شد." @@ -19472,6 +19518,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/fi/LC_MESSAGES/messages.po b/superset/translations/fi/LC_MESSAGES/messages.po index 1d0201353e7c..c268342ef565 100644 --- a/superset/translations/fi/LC_MESSAGES/messages.po +++ b/superset/translations/fi/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: fi\n" @@ -1710,6 +1710,9 @@ msgstr "Uusi kaavio luodaan." msgid "A new dashboard will be created." msgstr "Uusi koontinäyttö luodaan." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -7870,6 +7873,9 @@ msgstr "Kulman säde" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pt_BR, ru, sk, sl, uk, zh, zh_TW] #, fuzzy @@ -11801,6 +11807,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Syötä osa objektin nimestä" +msgid "Enter a value transform before validating against data." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ca, cs, de, # es, fa, fr, ja, lv, mi, ru, sk, sl, uk] #, fuzzy @@ -11828,6 +11837,9 @@ msgstr "Syötä ryhmän nimi" msgid "Enter minimum and maximum values for the range filter" msgstr "Syötä aluesuodattimen minimi- ja maksimiarvot" +msgid "Enter one to three existing partition keys." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ca, cs, de, # es, fa, fr, ja, lv, mi, ru, sk, sl, uk] #, fuzzy @@ -13364,6 +13376,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -16787,8 +16809,10 @@ msgid "Match type" msgstr "Tietotyyppi" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, fr, ja, # lv, ru, sk, uk] @@ -18049,6 +18073,12 @@ msgstr "Ei käytettävissä olevia suodattimia." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -19621,6 +19651,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -22639,6 +22672,9 @@ msgstr "" msgid "Save query" msgstr "Tallenna kysely" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -25120,9 +25156,6 @@ msgstr "Joitakin ryhmiä ei voitu selvittää, ja ne näytetään tunnisteina." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -27869,6 +27902,12 @@ msgstr "" msgid "The report has been created" msgstr "Raportti on luotu" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ca, cs, de, # es, fa, ja, lv, mi, ru, sk, sl, uk] #, fuzzy @@ -28324,6 +28363,13 @@ msgstr "Käyttäjä on päivitetty onnistuneesti." msgid "The user has been updated successfully." msgstr "Käyttäjä on päivitetty onnistuneesti." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, ja, lv, # ru, sk, uk] #, fuzzy @@ -29633,6 +29679,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/fr/LC_MESSAGES/messages.po b/superset/translations/fr/LC_MESSAGES/messages.po index 2a6c4bd72c03..421f7ecf4411 100644 --- a/superset/translations/fr/LC_MESSAGES/messages.po +++ b/superset/translations/fr/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2025-06-26 15:34+0200\n" "Last-Translator: \n" "Language: fr\n" @@ -1226,6 +1226,9 @@ msgstr "Un nouveau graphique va être créé." msgid "A new dashboard will be created." msgstr "Un nouveau tableau de bord va être créé." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5016,6 +5019,9 @@ msgstr "Rayon des coins" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Corrélation" @@ -7391,6 +7397,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Saisir une partie du nom de l'objet" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Saisir le nom de l'alerte" @@ -7408,6 +7417,9 @@ msgstr "Saisir le nom du groupe" msgid "Enter minimum and maximum values for the range filter" msgstr "Entrer une valeur minimal et maximal pour la plage du filter" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Saisir le nom du rapport" @@ -8368,6 +8380,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10431,8 +10453,10 @@ msgid "Match type" msgstr "Correspondance du type" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" msgid "Matrixify" msgstr "Matrixify" @@ -11186,6 +11210,12 @@ msgstr "Aucun filtre disponible." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12175,6 +12205,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -13992,6 +14025,9 @@ msgstr "" msgid "Save query" msgstr "Enregistrer la requête" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -15526,9 +15562,6 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] msgid "Some permissions could not be resolved and are shown as IDs." @@ -17372,6 +17405,12 @@ msgstr "" msgid "The report has been created" msgstr "Le rapport a été créé" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "Les rapports planifiés seront envoyés à votre adresse courriel à" @@ -17709,6 +17748,13 @@ msgstr "L'utilisateur a été créé avec succès." msgid "The user has been updated successfully." msgstr "L'utilisateur a été mis à jour avec succès." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "L'utilisateur a été mis à jour avec succès" @@ -18698,6 +18744,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/it/LC_MESSAGES/messages.po b/superset/translations/it/LC_MESSAGES/messages.po index 29a84a2dc191..01e3b0d857e4 100644 --- a/superset/translations/it/LC_MESSAGES/messages.po +++ b/superset/translations/it/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2018-02-11 22:26+0200\n" "Last-Translator: Raffaele Spangaro \n" "Language: it\n" @@ -1459,6 +1459,9 @@ msgstr "Sarà creato un nuovo grafico." msgid "A new dashboard will be created." msgstr "Una nuova dashboard sarà creata." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -6089,6 +6092,9 @@ msgstr "Raggio d'angolo" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Correlazione" @@ -8892,6 +8898,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Inserire una parte del nome oggetto" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Immettere il nome dell'avviso" @@ -8912,6 +8921,9 @@ msgstr "Immettere il nome del gruppo" msgid "Enter minimum and maximum values for the range filter" msgstr "Inserisci i valori minimo e massimo per il filtro intervallo" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Immettere il nome del report" @@ -10071,6 +10083,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -12778,8 +12800,10 @@ msgid "Match type" msgstr "Tipo" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] @@ -13723,6 +13747,12 @@ msgstr "Nessun filtro disponibile." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -14942,6 +14972,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -17215,6 +17248,9 @@ msgstr "" msgid "Save query" msgstr "query condivisa" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -19053,9 +19089,6 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] msgid "Some permissions could not be resolved and are shown as IDs." @@ -21256,6 +21289,12 @@ msgstr "I rimanenti %s verranno spostati in Archiviati di recente." msgid "The report has been created" msgstr "Il rapporto è stato creato" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ca, cs, de, # es, fa, ja, lv, mi, ro, ru, sk, sl, sr, sr_Latn, tr, uk] msgid "The report will be sent to your email at" @@ -21646,6 +21685,13 @@ msgstr "L'utente è stato creato." msgid "The user has been updated successfully." msgstr "L'utente è stato aggiornato." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "L'utente è stato aggiornato." @@ -22794,6 +22840,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/ja/LC_MESSAGES/messages.po b/superset/translations/ja/LC_MESSAGES/messages.po index a2df8fe69363..ba0d1497feca 100644 --- a/superset/translations/ja/LC_MESSAGES/messages.po +++ b/superset/translations/ja/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2024-05-14 13:30+0900\n" "Last-Translator: Yuri Umezaki \n" "Language: ja\n" @@ -1126,6 +1126,9 @@ msgstr "新しいチャートが作成されます。" msgid "A new dashboard will be created." msgstr "新しいダッシュボードが作成されます。" +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -4586,6 +4589,9 @@ msgstr "角の丸み" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "相関" @@ -6746,6 +6752,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "オブジェクト名の一部を入力" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "アラート名を入力" @@ -6761,6 +6770,9 @@ msgstr "グループ名を入力" msgid "Enter minimum and maximum values for the range filter" msgstr "範囲フィルターの最小値と最大値を入力してください" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "レポート名を入力" @@ -7684,6 +7696,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -9611,8 +9633,9 @@ msgid "Match type" msgstr "一致種類" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" msgid "Matrixify" msgstr "マトリックス化" @@ -10324,6 +10347,12 @@ msgstr "利用可能なフィルターはありません。" msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -11227,6 +11256,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -12949,6 +12981,9 @@ msgstr "" msgid "Save query" msgstr "クエリを保存" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -14313,9 +14348,6 @@ msgstr "一部のグループを解決できなかったため、IDとして表 msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - msgid "Some permissions could not be resolved and are shown as IDs." msgstr "一部の権限を解決できなかったため、IDとして表示されています。" @@ -15907,6 +15939,12 @@ msgstr "" msgid "The report has been created" msgstr "レポートを作成しました" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "レポートは指定されたメールアドレスに送信されます" @@ -16196,6 +16234,13 @@ msgstr "ユーザーを正常に作成しました。" msgid "The user has been updated successfully." msgstr "ユーザーを正常に更新しました。" +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "ユーザーを正常に更新しました" @@ -17043,6 +17088,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/ko/LC_MESSAGES/messages.po b/superset/translations/ko/LC_MESSAGES/messages.po index 13303c261564..22804a85ff84 100644 --- a/superset/translations/ko/LC_MESSAGES/messages.po +++ b/superset/translations/ko/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2019-02-02 22:28+0900\n" "Last-Translator: \n" "Language: ko\n" @@ -1564,6 +1564,9 @@ msgstr "차트를 생성할 수 없습니다." msgid "A new dashboard will be created." msgstr "대시보드를 생성할 수 없습니다." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -7081,6 +7084,9 @@ msgstr "모서리 반경" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pt_BR, ro, ru, sk, sl, sr, sr_Latn, tr, uk, # zh, zh_TW] @@ -10471,6 +10477,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "차트 유형" +msgid "Enter a value transform before validating against data." +msgstr "" + #, fuzzy msgid "Enter alert name" msgstr "테이블 명" @@ -10495,6 +10504,9 @@ msgstr "그룹 이름 입력" msgid "Enter minimum and maximum values for the range filter" msgstr "범위 필터의 최솟값과 최댓값을 입력하세요" +msgid "Enter one to three existing partition keys." +msgstr "" + #, fuzzy msgid "Enter report name" msgstr "차트 유형" @@ -11906,6 +11918,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -15099,8 +15121,9 @@ msgid "Match type" msgstr "차트 유형" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] @@ -16257,6 +16280,12 @@ msgstr "필터" msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -17744,6 +17773,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -20534,6 +20566,9 @@ msgstr "" msgid "Save query" msgstr "Query 저장" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -22671,9 +22706,6 @@ msgstr "일부 그룹을 확인할 수 없어 ID로 표시됩니다." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -25236,6 +25268,12 @@ msgstr "" msgid "The report has been created" msgstr "보고서가 생성되었습니다" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ca, cs, de, # es, fa, ja, lv, mi, ro, ru, sk, sl, sr, sr_Latn, tr, uk] #, fuzzy @@ -25674,6 +25712,13 @@ msgstr "주석 레이어" msgid "The user has been updated successfully." msgstr "주석 레이어" +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, ja, # lv, ro, ru, sk, sr, sr_Latn, uk] #, fuzzy @@ -26908,6 +26953,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/lv/LC_MESSAGES/messages.po b/superset/translations/lv/LC_MESSAGES/messages.po index ef55947cd862..f18aaefb2c5c 100644 --- a/superset/translations/lv/LC_MESSAGES/messages.po +++ b/superset/translations/lv/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2026-03-27 14:01+0200\n" "Last-Translator: FULL NAME \n" "Language: lv\n" @@ -1249,6 +1249,9 @@ msgstr "Tiks izveidota jauna diagramma." msgid "A new dashboard will be created." msgstr "Tiks izveidots jauns infopanelis." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -4964,6 +4967,9 @@ msgstr "Stūra rādiuss" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Korelācija" @@ -7318,6 +7324,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Ievadiet daļu no objekta nosaukuma" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Ievadiet brīdinājuma nosaukumu" @@ -7333,6 +7342,9 @@ msgstr "Ievadiet grupas nosaukumu" msgid "Enter minimum and maximum values for the range filter" msgstr "Ievadiet minimālās un maksimālās vērtības diapazona filtram" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Ievadiet atskaites nosaukumu" @@ -8283,6 +8295,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10325,8 +10347,11 @@ msgid "Match type" msgstr "Datu tips" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" msgid "Matrixify" msgstr "Iespējot Matrixify" @@ -11081,6 +11106,12 @@ msgstr "Nav pieejamu filtru." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12050,6 +12081,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -13846,6 +13880,9 @@ msgstr "" msgid "Save query" msgstr "Saglabāt vaicājumu" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -15366,9 +15403,6 @@ msgstr "Dažas grupas nevarēja tikt atrisinātas un tiek rādītas kā ID." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -17151,6 +17185,12 @@ msgstr "" msgid "The report has been created" msgstr "Atskaite ir izveidota" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "Atskaite tiks nosūtīta uz jūsu e-pastu" @@ -17478,6 +17518,13 @@ msgstr "Lietotājs ir veiksmīgi atjaunināts." msgid "The user has been updated successfully." msgstr "Lietotājs ir veiksmīgi atjaunināts." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "Lietotājs veiksmīgi atjaunināts" @@ -18404,6 +18451,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/messages.pot b/superset/translations/messages.pot index cd6960d04f15..cf4dbb697b26 100644 --- a/superset/translations/messages.pot +++ b/superset/translations/messages.pot @@ -25,7 +25,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1034,6 +1034,9 @@ msgstr "" msgid "A new dashboard will be created." msgstr "" +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -4241,6 +4244,9 @@ msgstr "" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "" @@ -6246,6 +6252,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "" @@ -6261,6 +6270,9 @@ msgstr "" msgid "Enter minimum and maximum values for the range filter" msgstr "" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "" @@ -7144,6 +7156,12 @@ msgstr "" msgid "Filters on the mapped column are mirrored onto this column so the engine can prune partitions." msgstr "" +msgid "Filters on this column are mapped onto the partition column, but are not mirrored." +msgstr "" + +msgid "Filters on this column are mapped onto the partition field, but this transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -8947,8 +8965,10 @@ msgid "Match type" msgstr "" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" msgid "Matrixify" msgstr "" @@ -9626,6 +9646,10 @@ msgstr "" msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "No checkable rows, or the query or transform failed, for partition keys: %(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -10450,6 +10474,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -12090,6 +12117,9 @@ msgstr "" msgid "Save query" msgstr "" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "Save the dataset to preview this mapping. The preview runs against the saved columns, and this mapping uses one that has not been saved yet." msgstr "" @@ -13337,9 +13367,6 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - msgid "Some permissions could not be resolved and are shown as IDs." msgstr "" diff --git a/superset/translations/mi/LC_MESSAGES/messages.po b/superset/translations/mi/LC_MESSAGES/messages.po index 9c83a116ef0a..14f3cc980246 100644 --- a/superset/translations/mi/LC_MESSAGES/messages.po +++ b/superset/translations/mi/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2026-01-25 16:09+1300\n" "Last-Translator: karo.co.nz\n" "Language: mi\n" @@ -1245,6 +1245,9 @@ msgstr "Ka hangaia he kauwhata hou." msgid "A new dashboard will be created." msgstr "Ka hangaia he papatohu hou." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5142,6 +5145,9 @@ msgstr "Pūtoro Koki" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Hononga" @@ -7601,6 +7607,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Mēnā ka whakakī i ngā ahanoa" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Tāuru ingoa matohi" @@ -7619,6 +7628,9 @@ msgstr "Tāuru i te ingoa rōpū" msgid "Enter minimum and maximum values for the range filter" msgstr "Tāuruhia ngā uara iti rawa me ngā uara nui rawa mō te tātari āputa" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Tāuru ingoa pūrongo" @@ -8633,6 +8645,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10798,8 +10820,10 @@ msgid "Match type" msgstr "Momo raraunga" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] @@ -11579,6 +11603,12 @@ msgstr "Kāore he tātari wātea." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12569,6 +12599,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -14450,6 +14483,9 @@ msgstr "" msgid "Save query" msgstr "Tiaki pātai" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -16070,9 +16106,6 @@ msgstr "Kāore ētahi rōpū i taea te whakaoti ā ka whakaaturia hei ID." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -17933,6 +17966,12 @@ msgstr "" msgid "The report has been created" msgstr "Kua hangaia te pūrongo" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "Ka tukuna te pūrongo ki tō īmēra i" @@ -18273,6 +18312,13 @@ msgstr "I tiakina pai tēnei papatohu." msgid "The user has been updated successfully." msgstr "I tiakina pai tēnei papatohu." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + #, fuzzy msgid "The user was updated successfully" msgstr "I tiakina pai tēnei papatohu." @@ -19274,6 +19320,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/nl/LC_MESSAGES/messages.po b/superset/translations/nl/LC_MESSAGES/messages.po index cb3bcac0e10b..affed7f83a67 100644 --- a/superset/translations/nl/LC_MESSAGES/messages.po +++ b/superset/translations/nl/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: superset-ds\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2024-05-08 14:41+0000\n" "Last-Translator: \n" "Language: nl\n" @@ -1257,6 +1257,9 @@ msgstr "Er zal een nieuwe grafiek worden aangemaakt." msgid "A new dashboard will be created." msgstr "Er zal een nieuw dashboard worden aangemaakt." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5298,6 +5301,9 @@ msgstr "Inner Radius" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Correlatie" @@ -7846,6 +7852,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Of de objecten moeten worden gevuld" +msgid "Enter a value transform before validating against data." +msgstr "" + #, fuzzy msgid "Enter alert name" msgstr "Naam van de waarschuwing" @@ -7865,6 +7874,9 @@ msgstr "Groepsnaam invoeren" msgid "Enter minimum and maximum values for the range filter" msgstr "Voer minimale en maximale waarden in voor het bereikfilter" +msgid "Enter one to three existing partition keys." +msgstr "" + #, fuzzy msgid "Enter report name" msgstr "Naam rapport" @@ -8923,6 +8935,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -11155,8 +11177,10 @@ msgid "Match type" msgstr "Data type" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] @@ -11975,6 +11999,12 @@ msgstr "Geen beschikbare filters." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12990,6 +13020,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -14921,6 +14954,9 @@ msgstr "" msgid "Save query" msgstr "Zoekopdracht opslaan" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -16577,9 +16613,6 @@ msgstr "Sommige groepen konden niet worden omgezet en worden weergegeven als ID' msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -18527,6 +18560,12 @@ msgstr "" msgid "The report has been created" msgstr "Het rapport is gemaakt" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + #, fuzzy msgid "The report will be sent to your email at" msgstr "" @@ -18888,6 +18927,13 @@ msgstr "Dit dashboard is succesvol opgeslagen." msgid "The user has been updated successfully." msgstr "Dit dashboard is succesvol opgeslagen." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + #, fuzzy msgid "The user was updated successfully" msgstr "Dit dashboard is succesvol opgeslagen." @@ -19913,6 +19959,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/pl/LC_MESSAGES/messages.po b/superset/translations/pl/LC_MESSAGES/messages.po index 3a1adca991b8..9fa09b6adeaf 100644 --- a/superset/translations/pl/LC_MESSAGES/messages.po +++ b/superset/translations/pl/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2021-11-16 17:33+0100\n" "Last-Translator: FULL NAME \n" "Language: pl\n" @@ -1290,6 +1290,9 @@ msgstr "Zostanie utworzony nowy wykres." msgid "A new dashboard will be created." msgstr "Zostanie utworzony nowy panel kontrolny." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5341,6 +5344,9 @@ msgstr "Promień wewnętrzny" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + #, fuzzy msgid "Correlation" msgstr "Korelacja" @@ -7959,6 +7965,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Czy wypełniać obiekty" +msgid "Enter a value transform before validating against data." +msgstr "" + #, fuzzy msgid "Enter alert name" msgstr "Wprowadź nazwę alertu" @@ -7978,6 +7987,9 @@ msgstr "Wprowadź nazwę grupy" msgid "Enter minimum and maximum values for the range filter" msgstr "Wprowadź wartości minimalne i maksymalne dla filtru zakresu" +msgid "Enter one to three existing partition keys." +msgstr "" + #, fuzzy msgid "Enter report name" msgstr "Wprowadź nazwę raportu" @@ -9058,6 +9070,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -11306,8 +11328,10 @@ msgid "Match type" msgstr "Typ danych" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] @@ -12141,6 +12165,12 @@ msgstr "Brak dostępnych filtrów." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -13158,6 +13188,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -15159,6 +15192,9 @@ msgstr "" msgid "Save query" msgstr "Zapisz zapytanie" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -16870,9 +16906,6 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -18843,6 +18876,12 @@ msgstr "" msgid "The report has been created" msgstr "Raport został utworzony." +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + #, fuzzy msgid "The report will be sent to your email at" msgstr "Raport zostanie wysłany na Twój adres e-mail o" @@ -19186,6 +19225,13 @@ msgstr "Ten pulpit został pomyślnie zapisany." msgid "The user has been updated successfully." msgstr "Ten pulpit został pomyślnie zapisany." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + #, fuzzy msgid "The user was updated successfully" msgstr "Ten pulpit został pomyślnie zapisany." @@ -20218,6 +20264,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/pt/LC_MESSAGES/messages.po b/superset/translations/pt/LC_MESSAGES/messages.po index c7b66832eaab..8685eb0345f6 100644 --- a/superset/translations/pt/LC_MESSAGES/messages.po +++ b/superset/translations/pt/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2026-07-17 14:21+0000\n" "Last-Translator: José Teixeira \n" "Language: pt\n" @@ -1511,6 +1511,9 @@ msgstr "Um novo gráfico será criado." msgid "A new dashboard will be created." msgstr "Um novo painel será criado." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -6276,6 +6279,9 @@ msgstr "Raio de canto" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Correlação" @@ -9239,6 +9245,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Insira uma parte do nome do objeto" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Insira o nome do alerta" @@ -9259,6 +9268,9 @@ msgstr "Introduza o nome do grupo" msgid "Enter minimum and maximum values for the range filter" msgstr "Digite os valores mínimo e máximo para o filtro de intervalo" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Insira o nome do relatório" @@ -10452,6 +10464,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -13169,8 +13191,10 @@ msgid "Match type" msgstr "Tipo de correspondência" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] @@ -14156,6 +14180,12 @@ msgstr "Não há filtros disponíveis." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -15443,6 +15473,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -17803,6 +17836,9 @@ msgstr "" msgid "Save query" msgstr "Salvar consulta" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -19682,9 +19718,6 @@ msgstr "Alguns grupos não puderam ser resolvidos e são mostrados como IDs." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] msgid "Some permissions could not be resolved and are shown as IDs." @@ -21972,6 +22005,12 @@ msgstr "" msgid "The report has been created" msgstr "O relatório foi criado" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ca, cs, de, # es, fa, ja, lv, mi, ro, ru, sk, sl, sr, sr_Latn, tr, uk] msgid "The report will be sent to your email at" @@ -22377,6 +22416,13 @@ msgstr "O usuário foi criado com sucesso." msgid "The user has been updated successfully." msgstr "O usuário foi atualizado com sucesso." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "O usuário foi atualizado com sucesso" @@ -23506,6 +23552,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/pt_BR/LC_MESSAGES/messages.po b/superset/translations/pt_BR/LC_MESSAGES/messages.po index f275e980da7a..ae5e832dca25 100644 --- a/superset/translations/pt_BR/LC_MESSAGES/messages.po +++ b/superset/translations/pt_BR/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2023-05-22 08:04-0400\n" "Last-Translator: \n" "Language: pt_BR\n" @@ -1246,6 +1246,9 @@ msgstr "Um novo gráfico será criado." msgid "A new dashboard will be created." msgstr "Um novo painel será criado." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5280,6 +5283,9 @@ msgstr "Raio de canto" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Correlação" @@ -7856,6 +7862,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Insira uma parte do nome do objeto" +msgid "Enter a value transform before validating against data." +msgstr "" + #, fuzzy msgid "Enter alert name" msgstr "Insira o nome do alerta" @@ -7872,6 +7881,9 @@ msgstr "Insira o nome do grupo" msgid "Enter minimum and maximum values for the range filter" msgstr "Digite os valores mínimo e máximo para o filtro de intervalo" +msgid "Enter one to three existing partition keys." +msgstr "" + #, fuzzy msgid "Enter report name" msgstr "Insira o nome do relatório" @@ -8939,6 +8951,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -11223,8 +11245,10 @@ msgid "Match type" msgstr "Tipo de correspondência" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] @@ -12024,6 +12048,12 @@ msgstr "Não há filtros disponíveis." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -13068,6 +13098,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -15048,6 +15081,9 @@ msgstr "" msgid "Save query" msgstr "Salvar consulta" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -16715,9 +16751,6 @@ msgstr "Alguns grupos não puderam ser resolvidos e são mostrados como IDs." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -18663,6 +18696,12 @@ msgstr "" msgid "The report has been created" msgstr "O relatório foi criado" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + #, fuzzy msgid "The report will be sent to your email at" msgstr "O relatório será enviado para seu e-mail em" @@ -19016,6 +19055,13 @@ msgstr "O usuário foi criado com sucesso." msgid "The user has been updated successfully." msgstr "O usuário foi atualizado com sucesso." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + #, fuzzy msgid "The user was updated successfully" msgstr "O usuário foi atualizado com sucesso" @@ -20029,6 +20075,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/ro/LC_MESSAGES/messages.po b/superset/translations/ro/LC_MESSAGES/messages.po index 28578218edc2..58a721baa23d 100644 --- a/superset/translations/ro/LC_MESSAGES/messages.po +++ b/superset/translations/ro/LC_MESSAGES/messages.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: ro\n" @@ -1307,6 +1307,9 @@ msgstr "Un grafic nou va fi creat." msgid "A new dashboard will be created." msgstr "Un panou de control va fi creat." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5242,6 +5245,9 @@ msgstr "Rază Colț" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Corelație" @@ -7787,6 +7793,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Introduceți o parte din numele obiectului" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Introduceți numele alertei" @@ -7802,6 +7811,9 @@ msgstr "Introduceți numele grupului" msgid "Enter minimum and maximum values for the range filter" msgstr "Introduceți valorile minime și maxime pentru filtrul de interval" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Introduceți numele raportului" @@ -8813,6 +8825,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -11001,8 +11023,11 @@ msgid "Match type" msgstr "Tip de potrivire" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" msgid "Matrixify" msgstr "Matrixify" @@ -11799,6 +11824,12 @@ msgstr "Fără filtre disponibile." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12803,6 +12834,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -14691,6 +14725,9 @@ msgstr "" msgid "Save query" msgstr "Salvează interogare" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -16332,9 +16369,6 @@ msgstr "Unele grupuri nu au putut fi rezolvate și sunt afișate ca ID-uri." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, ja, sr, # sr_Latn] #, fuzzy @@ -18226,6 +18260,12 @@ msgstr "" msgid "The report has been created" msgstr "Raportul a fost creat" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "Raportul va fi trimis la adresa dvs. de email la" @@ -18566,6 +18606,13 @@ msgstr "Utilizatorul a fost creat cu succes." msgid "The user has been updated successfully." msgstr "Utilizatorul a fost actualizat cu succes." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "Utilizatorul a fost actualizat cu succes" @@ -19577,6 +19624,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/ru/LC_MESSAGES/messages.po b/superset/translations/ru/LC_MESSAGES/messages.po index 0b931ec7c51a..762d058c00ec 100644 --- a/superset/translations/ru/LC_MESSAGES/messages.po +++ b/superset/translations/ru/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2026-07-17 09:44+0100\n" "Last-Translator: Daniel Checheta\n" "Language: ru\n" @@ -1235,6 +1235,9 @@ msgstr "Не удалось создать диаграмму" msgid "A new dashboard will be created." msgstr "Новый дашборд будет создан" +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -4896,6 +4899,9 @@ msgstr "Радиус скругления" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Корреляция" @@ -7210,6 +7216,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Введите часть имени объекта" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Введите имя оповещения" @@ -7225,6 +7234,9 @@ msgstr "Введите имя группы" msgid "Enter minimum and maximum values for the range filter" msgstr "Введите минимальное и максимальное значения для диапазона" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Введите имя отчета" @@ -8161,6 +8173,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10174,8 +10196,11 @@ msgid "Match type" msgstr "Тип данных" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" msgid "Matrixify" msgstr "Матричное расположение" @@ -10921,6 +10946,12 @@ msgstr "Нет доступных фильтров" msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -11884,6 +11915,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -13654,6 +13688,9 @@ msgstr "" msgid "Save query" msgstr "Сохранить запрос" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -15099,9 +15136,6 @@ msgstr "Некоторые группы не удалось найти, поэт msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] msgid "Some permissions could not be resolved and are shown as IDs." @@ -16853,6 +16887,12 @@ msgstr "" msgid "The report has been created" msgstr "Рассылка создана" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "Отчет будет отправлен на ваш email" @@ -17180,6 +17220,13 @@ msgstr "Пользователь создан." msgid "The user has been updated successfully." msgstr "Пользователь обновлен." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "Пользователь обновлен" @@ -18100,6 +18147,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/sk/LC_MESSAGES/messages.po b/superset/translations/sk/LC_MESSAGES/messages.po index b5f09dc0fefe..c4ba5d327163 100644 --- a/superset/translations/sk/LC_MESSAGES/messages.po +++ b/superset/translations/sk/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2026-05-18 15:42+0200\n" "Last-Translator: FULL NAME \n" "Language: sk\n" @@ -1243,6 +1243,9 @@ msgstr "Bude vytvorený nový graf." msgid "A new dashboard will be created." msgstr "Bude vytvorená nová nástenka." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5019,6 +5022,9 @@ msgstr "Polomer rohu" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Korelácie" @@ -7440,6 +7446,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Zadejte část názvu objektu" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Zadejte názov upozornenie" @@ -7455,6 +7464,9 @@ msgstr "Zadajte názov skupiny" msgid "Enter minimum and maximum values for the range filter" msgstr "Zadejte minimální a maximální hodnoty pre filter rozsahu" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Zadejte názov reportu" @@ -8433,6 +8445,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10521,8 +10543,11 @@ msgid "Match type" msgstr "Datový typ" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" msgid "Matrixify" msgstr "Matrixify" @@ -11289,6 +11314,12 @@ msgstr "Nesú k dispozici žiadne filtre." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12273,6 +12304,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -14108,6 +14142,9 @@ msgstr "" msgid "Save query" msgstr "Uložiť dotaz" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -15660,9 +15697,6 @@ msgstr "Niektoré skupiny sa nepodarilo vyriešiť a sú zobrazené ako ID." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -17462,6 +17496,12 @@ msgstr "" msgid "The report has been created" msgstr "Report bol vytvořen" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "Report bude odeslán na váš e-mail na adresu" @@ -17790,6 +17830,13 @@ msgstr "Používateľ bol úspešne aktualizován." msgid "The user has been updated successfully." msgstr "Používateľ bol úspešne aktualizován." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "Používateľ bol úspešne aktualizován" @@ -18745,6 +18792,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/sl/LC_MESSAGES/messages.po b/superset/translations/sl/LC_MESSAGES/messages.po index 233cded751e6..89aadac06980 100644 --- a/superset/translations/sl/LC_MESSAGES/messages.po +++ b/superset/translations/sl/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset\n" "Report-Msgid-Bugs-To: dkrat7 @github.com\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2026-07-29 16:16+0200\n" "Last-Translator: lapor-kris \n" "Language: sl_SI\n" @@ -1284,6 +1284,9 @@ msgstr "Ustvarjen bo nov grafikon." msgid "A new dashboard will be created." msgstr "Ustvarjena bo nova nadzorna plošča." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5032,6 +5035,9 @@ msgstr "Radij kota" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Korelacija" @@ -7416,6 +7422,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Vnesite del imena predmeta" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Vnesite naslov opozorila" @@ -7433,6 +7442,9 @@ msgstr "Vnesite ime skupine" msgid "Enter minimum and maximum values for the range filter" msgstr "Vnesite najmanjšo in največjo vrednost za filter obsega" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Vnesite naslov poročila" @@ -8412,6 +8424,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10466,8 +10488,12 @@ msgid "Match type" msgstr "Vrsta ujemanja" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] @@ -11240,6 +11266,12 @@ msgstr "Ni razpoložljivih filtrov." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12200,6 +12232,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -14025,6 +14060,9 @@ msgstr "" msgid "Save query" msgstr "Shrani poizvedbo" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -15538,9 +15576,6 @@ msgstr "Nekaterih skupin ni bilo mogoče razrešiti in so prikazane kot ID-ji." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] msgid "Some permissions could not be resolved and are shown as IDs." @@ -17335,6 +17370,12 @@ msgstr "" msgid "The report has been created" msgstr "Poročilo je bilo ustvarjeno" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "Poročilo bo poslano na vaš e-naslov ob" @@ -17660,6 +17701,13 @@ msgstr "Uporabnik je bil uspešno ustvarjen." msgid "The user has been updated successfully." msgstr "Uporabnik je bil uspešno posodobljen." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "Uporabnik je bil uspešno posodobljen" @@ -18607,6 +18655,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/sr/LC_MESSAGES/messages.po b/superset/translations/sr/LC_MESSAGES/messages.po index 6889f391c7ea..5c1f9774d36d 100644 --- a/superset/translations/sr/LC_MESSAGES/messages.po +++ b/superset/translations/sr/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2026-06-14 13:20+0200\n" "Last-Translator: FULL NAME \n" "Language: sr\n" @@ -1416,6 +1416,9 @@ msgstr "Биће креиран нови графикон." msgid "A new dashboard will be created." msgstr "Биће креирана нова контролна табла." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5924,6 +5927,9 @@ msgstr "Радијус угла" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pt_BR, ru, sk, sl, uk, zh, zh_TW] msgid "Correlation" msgstr "Корелација" @@ -8813,6 +8819,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Унесите део назива објекта" +msgid "Enter a value transform before validating against data." +msgstr "" + # es, fa, fr, ja, lv, mi, ru, sk, sl, uk] msgid "Enter alert name" msgstr "Унесите назив упозорења" @@ -8832,6 +8841,9 @@ msgstr "Унесите назив групе" msgid "Enter minimum and maximum values for the range filter" msgstr "Унесите минималну и максималну вредност за филтер опсега" +msgid "Enter one to three existing partition keys." +msgstr "" + # es, fa, fr, ja, lv, mi, ru, sk, sl, uk] msgid "Enter report name" msgstr "Унесите назив извештаја" @@ -9967,6 +9979,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -12418,8 +12440,11 @@ msgid "Match type" msgstr "Тип подударања" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" # lv, ru, sk, uk] msgid "Matrixify" @@ -13330,6 +13355,12 @@ msgstr "Нема доступних филтера." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -14498,6 +14529,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -16695,6 +16729,9 @@ msgstr "" msgid "Save query" msgstr "Сачувај упит" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -18462,9 +18499,6 @@ msgstr "Неке групе нису могле бити разрешене и msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - msgid "Some permissions could not be resolved and are shown as IDs." msgstr "Неке дозволе нису могле бити разрешене и приказане су као ИД-ови." @@ -20542,6 +20576,12 @@ msgstr "" msgid "The report has been created" msgstr "Извештај је креиран" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + # es, fa, ja, lv, mi, ru, sk, sl, uk] msgid "The report will be sent to your email at" msgstr "Извештај ће бити послат на ваш имејл на" @@ -20910,6 +20950,13 @@ msgstr "Корисник је успешно креиран." msgid "The user has been updated successfully." msgstr "Корисник је успешно ажуриран." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + # ru, sk, uk] msgid "The user was updated successfully" msgstr "Корисник је успешно ажуриран" @@ -21961,6 +22008,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/sr_Latn/LC_MESSAGES/messages.po b/superset/translations/sr_Latn/LC_MESSAGES/messages.po index 35e161b23980..aeb8bf282cdb 100644 --- a/superset/translations/sr_Latn/LC_MESSAGES/messages.po +++ b/superset/translations/sr_Latn/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2026-06-14 13:20+0200\n" "Last-Translator: FULL NAME \n" "Language: sr_Latn\n" @@ -1416,6 +1416,9 @@ msgstr "Biće kreiran novi grafikon." msgid "A new dashboard will be created." msgstr "Biće kreirana nova kontrolna tabla." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5927,6 +5930,9 @@ msgstr "Radijus ugla" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + # de, es, fa, fr, ja, lv, mi, nl, pt_BR, ru, sk, sl, uk, zh, zh_TW] msgid "Correlation" msgstr "Korelacija" @@ -8817,6 +8823,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Unesite deo naziva objekta" +msgid "Enter a value transform before validating against data." +msgstr "" + # es, fa, fr, ja, lv, mi, ru, sk, sl, uk] msgid "Enter alert name" msgstr "Unesite naziv upozorenja" @@ -8836,6 +8845,9 @@ msgstr "Unesite naziv grupe" msgid "Enter minimum and maximum values for the range filter" msgstr "Unesite minimalnu i maksimalnu vrednost za filter opsega" +msgid "Enter one to three existing partition keys." +msgstr "" + # es, fa, fr, ja, lv, mi, ru, sk, sl, uk] msgid "Enter report name" msgstr "Unesite naziv izveštaja" @@ -9971,6 +9983,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -12425,8 +12447,11 @@ msgid "Match type" msgstr "Tip podudaranja" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" # lv, ru, sk, uk] msgid "Matrixify" @@ -13337,6 +13362,12 @@ msgstr "Nema dostupnih filtera." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -14505,6 +14536,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -16702,6 +16736,9 @@ msgstr "" msgid "Save query" msgstr "Sačuvaj upit" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -18469,9 +18506,6 @@ msgstr "Neke grupe nisu mogle biti razrešene i prikazane su kao ID-ovi." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - msgid "Some permissions could not be resolved and are shown as IDs." msgstr "Neke dozvole nisu mogle biti razrešene i prikazane su kao ID-ovi." @@ -20550,6 +20584,12 @@ msgstr "" msgid "The report has been created" msgstr "Izveštaj je kreiran" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + # es, fa, ja, lv, mi, ru, sk, sl, uk] msgid "The report will be sent to your email at" msgstr "Izveštaj će biti poslat na vaš imejl na" @@ -20918,6 +20958,13 @@ msgstr "Korisnik je uspešno kreiran." msgid "The user has been updated successfully." msgstr "Korisnik je uspešno ažuriran." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + # ru, sk, uk] msgid "The user was updated successfully" msgstr "Korisnik je uspešno ažuriran" @@ -21978,6 +22025,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/ta/LC_MESSAGES/messages.po b/superset/translations/ta/LC_MESSAGES/messages.po index 01b6b7bc2d30..9477553e58a0 100644 --- a/superset/translations/ta/LC_MESSAGES/messages.po +++ b/superset/translations/ta/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2026-03-31 02:00-0700\n" "Last-Translator: Maazin Ahamed\n" "Language: ta\n" @@ -1206,6 +1206,9 @@ msgstr "ஒரு புதிய சார்ட் உருவாக்கப msgid "A new dashboard will be created." msgstr "ஒரு புதிய டேஷ்போர்டு உருவாக்கப்படும்." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -4926,6 +4929,9 @@ msgstr "மூலை ஆரம் (Corner Radius)" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "ஒட்டுறவு (Correlation)" @@ -7245,6 +7251,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "பொருளின் பெயரின் ஒரு பகுதியை உள்ளிடவும்" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "எச்சரிக்கை பெயரை உள்ளிடவும்" @@ -7262,6 +7271,9 @@ msgstr "" "வரம்பு வடிகட்டிக்கான (range filter) குறைந்தபட்ச மற்றும் அதிகபட்ச " "மதிப்புகளை உள்ளிடவும்" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "அறிக்கை பெயரை உள்ளிடவும்" @@ -8213,6 +8225,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10203,8 +10225,10 @@ msgid "Match type" msgstr "தரவு வகை" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" msgid "Matrixify" msgstr "மேட்ரிசிஃபை (Matrixify)" @@ -10930,6 +10954,12 @@ msgstr "கிடைக்கக்கூடிய வடிகட்டிக msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -11848,6 +11878,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -13602,6 +13635,9 @@ msgstr "" msgid "Save query" msgstr "வினவலைச் சேமி" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -15053,9 +15089,6 @@ msgstr "" msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - msgid "Some permissions could not be resolved and are shown as IDs." msgstr "" @@ -16712,6 +16745,12 @@ msgstr "" msgid "The report has been created" msgstr "அறிக்கை உருவாக்கப்பட்டது" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "அறிக்கை உங்கள் மின்னஞ்சலுக்கு அனுப்பப்படும் நேரம்" @@ -17019,6 +17058,13 @@ msgstr "பயனர் வெற்றிகரமாக புதுப்ப msgid "The user has been updated successfully." msgstr "பயனர் வெற்றிகரமாக புதுப்பிக்கப்பட்டார்." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "பயனர் வெற்றிகரமாக புதுப்பிக்கப்பட்டார்" @@ -17914,6 +17960,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/th/LC_MESSAGES/messages.po b/superset/translations/th/LC_MESSAGES/messages.po index 8ece3b148c3f..31ec05089221 100644 --- a/superset/translations/th/LC_MESSAGES/messages.po +++ b/superset/translations/th/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: th\n" @@ -1656,6 +1656,9 @@ msgstr "แผนภูมิใหม่จะถูกสร้างขึ้ msgid "A new dashboard will be created." msgstr "แดชบอร์ดใหม่จะถูกสร้างขึ้น" +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -7730,6 +7733,9 @@ msgstr "รัศมีมุม" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ar, ca, cs, # de, es, fa, fr, ja, lv, mi, nl, pt_BR, ru, sk, sl, uk, zh, zh_TW] #, fuzzy @@ -11612,6 +11618,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "ป้อนส่วนหนึ่งของชื่อออบเจ็กต์" +msgid "Enter a value transform before validating against data." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ca, cs, de, # es, fa, fr, ja, lv, mi, ru, sk, sl, uk] #, fuzzy @@ -11639,6 +11648,9 @@ msgstr "ป้อนชื่อกลุ่ม" msgid "Enter minimum and maximum values for the range filter" msgstr "ป้อนค่าต่ำสุดและสูงสุดสำหรับตัวกรองช่วง" +msgid "Enter one to three existing partition keys." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ca, cs, de, # es, fa, fr, ja, lv, mi, ru, sk, sl, uk] #, fuzzy @@ -13170,6 +13182,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -16574,8 +16596,9 @@ msgid "Match type" msgstr "ประเภทข้อมูล" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, fr, ja, # lv, ru, sk, uk] @@ -17830,6 +17853,12 @@ msgstr "ไม่มีตัวกรองที่ใช้งานได้ msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -19386,6 +19415,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -22397,6 +22429,9 @@ msgstr "" msgid "Save query" msgstr "บันทึกคำค้นหา" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -24856,9 +24891,6 @@ msgstr "บางกลุ่มไม่สามารถระบุได้ msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -27565,6 +27597,12 @@ msgstr "" msgid "The report has been created" msgstr "รายงานถูกสร้างแล้ว" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: ca, cs, de, # es, fa, ja, lv, mi, ru, sk, sl, uk] #, fuzzy @@ -28010,6 +28048,13 @@ msgstr "อัปเดตผู้ใช้เรียบร้อยแล้ msgid "The user has been updated successfully." msgstr "อัปเดตผู้ใช้เรียบร้อยแล้ว" +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, ja, lv, # ru, sk, uk] #, fuzzy @@ -29289,6 +29334,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/tr/LC_MESSAGES/messages.po b/superset/translations/tr/LC_MESSAGES/messages.po index 4300f4710793..5b8d5b0cb9e5 100644 --- a/superset/translations/tr/LC_MESSAGES/messages.po +++ b/superset/translations/tr/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: avsarcoteli@gmail.com\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2024-02-25 14:00+0300\n" "Last-Translator: FULL NAME \n" "Language: tr\n" @@ -1205,6 +1205,9 @@ msgstr "Yeni bir grafik oluşturulacaktır." msgid "A new dashboard will be created." msgstr "Yeni bir pano oluşturulacak." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5007,6 +5010,9 @@ msgstr "Corner Radius" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Correlation" @@ -7388,6 +7394,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Nesne adının bir kısmını girin" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Alarm adını girin" @@ -7403,6 +7412,9 @@ msgstr "Grup adını girin" msgid "Enter minimum and maximum values for the range filter" msgstr "aralığı filtre için minimum ve maksimum değerler girin" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Rapor adını girin" @@ -8385,6 +8397,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10459,8 +10481,9 @@ msgid "Match type" msgstr "Eşleşme türü" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" msgid "Matrixify" msgstr "Matrixify" @@ -11231,6 +11254,12 @@ msgstr "Uygun filtre yok." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12212,6 +12241,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -14043,6 +14075,9 @@ msgstr "" msgid "Save query" msgstr "Sorguyu kaydet" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -15667,9 +15702,6 @@ msgstr "Bazı gruplar çözümlenemedi ve ID olarak gösteriliyor." msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -17502,6 +17534,12 @@ msgstr "" msgid "The report has been created" msgstr "Rapor oluşturuldu" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "Rapor e-postanıza gönderilecek" @@ -17831,6 +17869,13 @@ msgstr "Kullanıcı başarıyla oluşturuldu." msgid "The user has been updated successfully." msgstr "Gösterim Paneli başarıyla kaydedildi." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + #, fuzzy msgid "The user was updated successfully" msgstr "Gösterim Paneli başarıyla kaydedildi." @@ -18813,6 +18858,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/uk/LC_MESSAGES/messages.po b/superset/translations/uk/LC_MESSAGES/messages.po index 983fbbbc534d..e5017897f3ed 100644 --- a/superset/translations/uk/LC_MESSAGES/messages.po +++ b/superset/translations/uk/LC_MESSAGES/messages.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: ted.korostiled@gmail.com\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2026-04-30 22:04+0300\n" "Last-Translator: Danylo Korostil\n" "Language: uk\n" @@ -1276,6 +1276,9 @@ msgstr "Створиться нова діаграма." msgid "A new dashboard will be created." msgstr "Створиться новий звіт." +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -4973,6 +4976,9 @@ msgstr "Заокруглення кутів" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "Кореляція" @@ -7336,6 +7342,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "Введіть частину назви об’єкта" +msgid "Enter a value transform before validating against data." +msgstr "" + msgid "Enter alert name" msgstr "Введіть назву оповіщення" @@ -7351,6 +7360,9 @@ msgstr "Введіть назву групи" msgid "Enter minimum and maximum values for the range filter" msgstr "Введіть мінімальне та максимальне значення для фільтра діапазону" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "Введіть назву доповіді" @@ -8305,6 +8317,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10335,8 +10357,12 @@ msgid "Match type" msgstr "Тип даних" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" msgid "Matrixify" msgstr "Матриця" @@ -11087,6 +11113,12 @@ msgstr "Немає доступних фільтрів." msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12053,6 +12085,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -13853,6 +13888,9 @@ msgstr "" msgid "Save query" msgstr "Зберегти запит" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -15377,9 +15415,6 @@ msgstr "Деякі групи не вдалося розпізнати і вон msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -17161,6 +17196,12 @@ msgstr "" msgid "The report has been created" msgstr "Доповідь створено" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "Доповідь надіслано на електрону пошту" @@ -17486,6 +17527,13 @@ msgstr "Користувача успішно оновлено." msgid "The user has been updated successfully." msgstr "Користувача успішно оновлено." +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "Користувача успішно оновлено" @@ -18414,6 +18462,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/zh/LC_MESSAGES/messages.po b/superset/translations/zh/LC_MESSAGES/messages.po index 083440f24390..a3066f30b234 100644 --- a/superset/translations/zh/LC_MESSAGES/messages.po +++ b/superset/translations/zh/LC_MESSAGES/messages.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: Apache Superset 0.22.1\n" "Report-Msgid-Bugs-To: zhouyao94@qq.com\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2019-01-04 22:19+0800\n" "Last-Translator: cdmikechen\n" "Language: zh\n" @@ -1254,6 +1254,9 @@ msgstr "将会创建一个新图表" msgid "A new dashboard will be created." msgstr "将创建一个新看板。" +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5044,6 +5047,9 @@ msgstr "圆角半径" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "相关性" @@ -7432,6 +7438,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "输入对象名称的一部分" +msgid "Enter a value transform before validating against data." +msgstr "" + #, fuzzy msgid "Enter alert name" msgstr "告警名称" @@ -7451,6 +7460,9 @@ msgstr "输入分组名称" msgid "Enter minimum and maximum values for the range filter" msgstr "输入范围过滤器的最小值和最大值" +msgid "Enter one to three existing partition keys." +msgstr "" + msgid "Enter report name" msgstr "输入报告名称" @@ -8479,6 +8491,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -10624,8 +10646,9 @@ msgid "Match type" msgstr "匹配类型" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] @@ -11427,6 +11450,12 @@ msgstr "没有可用的筛选器。" msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -12417,6 +12446,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -14315,6 +14347,9 @@ msgstr "" msgid "Save query" msgstr "保存查询" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -15822,9 +15857,6 @@ msgstr "某些组无法解析,已显示为ID。" msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] msgid "Some permissions could not be resolved and are shown as IDs." @@ -17603,6 +17635,12 @@ msgstr "其余 %s 将被移至“最近归档”。" msgid "The report has been created" msgstr "报告已创建" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + msgid "The report will be sent to your email at" msgstr "报告将发送到您的电子邮件" @@ -17910,6 +17948,13 @@ msgstr "用户已成功创建。" msgid "The user has been updated successfully." msgstr "用户已成功更新。" +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + msgid "The user was updated successfully" msgstr "用户已成功更新。" @@ -18846,6 +18891,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/superset/translations/zh_TW/LC_MESSAGES/messages.po b/superset/translations/zh_TW/LC_MESSAGES/messages.po index a80626faed5e..9419eaf0c5cc 100644 --- a/superset/translations/zh_TW/LC_MESSAGES/messages.po +++ b/superset/translations/zh_TW/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Apache Superset 0.22.1\n" "Report-Msgid-Bugs-To: bestlong168@gmail.com\n" -"POT-Creation-Date: 2026-10-29 14:01+0000\n" +"POT-Creation-Date: 2026-10-29 23:46+0000\n" "PO-Revision-Date: 2019-01-04 22:19+0800\n" "Last-Translator: Shao Yu-Lung \n" "Language: zh_TW\n" @@ -1273,6 +1273,9 @@ msgstr "將會創建一個新圖表" msgid "A new dashboard will be created." msgstr "將會創建一個新看板" +msgid "A partition key must be a whole number within the 64-bit range." +msgstr "" + #, python-format msgid "A partition value transform cannot be longer than %(limit)d characters." msgstr "" @@ -5318,6 +5321,9 @@ msgstr "内半徑" msgid "Correct the mapping expression before validating data." msgstr "" +msgid "Correct the value transform before validating against data." +msgstr "" + msgid "Correlation" msgstr "相關性" @@ -7874,6 +7880,9 @@ msgstr "" msgid "Enter a part of the object name" msgstr "是否填充對象" +msgid "Enter a value transform before validating against data." +msgstr "" + #, fuzzy msgid "Enter alert name" msgstr "告警名稱" @@ -7893,6 +7902,9 @@ msgstr "輸入群組名稱" msgid "Enter minimum and maximum values for the range filter" msgstr "輸入範圍篩選器的最小值和最大值" +msgid "Enter one to three existing partition keys." +msgstr "" + #, fuzzy msgid "Enter report name" msgstr "報告名稱" @@ -8993,6 +9005,16 @@ msgid "" "can prune partitions." msgstr "" +msgid "" +"Filters on this column are mapped onto the partition column, but are not " +"mirrored." +msgstr "" + +msgid "" +"Filters on this column are mapped onto the partition field, but this " +"transform is refused, so they are not mirrored." +msgstr "" + msgid "Filters on this column are mirrored onto the partition column." msgstr "" @@ -11293,8 +11315,9 @@ msgid "Match type" msgstr "數據類型" #, python-format -msgid "Matched %(rows)s sampled rows across %(partitions)s partitions" -msgstr "" +msgid "Matched %(rows)s sampled rows across %(partitions)s partition" +msgid_plural "Matched %(rows)s sampled rows across %(partitions)s partitions" +msgstr[0] "" # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: cs, de, fr, # ja, lv, ro, ru, sk, sr, sr_Latn, tr, uk] @@ -12140,6 +12163,12 @@ msgstr "没有有效的過濾器" msgid "No charts or dashboards depend on the selected %s." msgstr "" +#, python-format +msgid "" +"No checkable rows, or the query or transform failed, for partition keys: " +"%(keys)s." +msgstr "" + msgid "No color mappings defined. Click \"+ Add more\" to get started." msgstr "" @@ -13182,6 +13211,9 @@ msgstr "" msgid "Partition filter mapping" msgstr "" +msgid "Partition keys must be whole numbers within the 64-bit range, up to three." +msgstr "" + msgid "Partition mismatch found" msgstr "" @@ -15177,6 +15209,9 @@ msgstr "" msgid "Save query" msgstr "保存查詢" +msgid "Save the dataset before validating against data." +msgstr "" + msgid "" "Save the dataset to preview this mapping. The preview runs against the " "saved columns, and this mapping uses one that has not been saved yet." @@ -16815,9 +16850,6 @@ msgstr "部分群組無法解析,以 ID 顯示。" msgid "Some layers could not be loaded" msgstr "" -msgid "Some partitions had no checkable rows, or the query or transform failed." -msgstr "" - # Machine-translated via backfill_po.py (claude-sonnet-4-6) [refs: de, sr, # sr_Latn] #, fuzzy @@ -18706,6 +18738,12 @@ msgstr "" msgid "The report has been created" msgstr "報告已創建" +#, python-format +msgid "" +"The report runs as %(username)s, who cannot access its %(kind)s: " +"%(reason)s" +msgstr "" + #, fuzzy msgid "The report will be sent to your email at" msgstr "計劃的報告將作為PNG發送到您的電子郵件" @@ -19037,6 +19075,13 @@ msgstr "該看板已成功保存。" msgid "The user has been updated successfully." msgstr "該看板已成功保存。" +#, python-format +msgid "" +"The user this report runs as cannot access this %(kind)s. Choose a " +"%(kind)s that user can access, or ask an admin to change who the report " +"runs as." +msgstr "" + #, fuzzy msgid "The user was updated successfully" msgstr "該看板已成功保存。" @@ -20034,6 +20079,13 @@ msgid "" "before. Please validate them, then accept this notice or save the chart." msgstr "" +#, python-format +msgid "" +"This report runs as %(username)s, who cannot access this %(kind)s. Choose" +" a %(kind)s that user can access, or a different user to run the report " +"as." +msgstr "" + msgid "" "This saved filter state predates the member-ID format. Reset it and " "explicitly choose its values again." diff --git a/tests/unit_tests/connectors/sqla/partition_validation_test.py b/tests/unit_tests/connectors/sqla/partition_validation_test.py index a52e3f7ba5a8..d578b85711e5 100644 --- a/tests/unit_tests/connectors/sqla/partition_validation_test.py +++ b/tests/unit_tests/connectors/sqla/partition_validation_test.py @@ -206,6 +206,10 @@ def test_data_validation_checks_corresponding_rows( assert probe.call_args.kwargs["fresh"] is True if status == "mismatch": assert result["examples"][0]["stored_key"] == "3600" + if status == "inconclusive": + # The key at fault is named, not left to a generic message. + assert result["inconclusive_keys"] == ["3600"] + assert "3600" in str(result["message"]) def test_validation_authorizes_before_reading_rows(app: Flask) -> None: @@ -350,3 +354,40 @@ def fetch(sql: str, *args: object, **kwargs: Any) -> pd.DataFrame: # A raw read stops at the limit; GROUP BY would aggregate the whole partition. assert all("GROUP BY" not in sql.upper() for sql in reads) connection.close() + + +def test_a_raw_instant_transform_is_refused_before_any_sample(app: Flask) -> None: + """ + Rows on the hour boundary match a raw-instant transform exactly, so sampled + rows alone could report as matched a transform the mirror declines. + """ + table = _table(transform="unix_timestamp(:value) * 1") + table.id = 1 + with ( + app.app_context(), + patch.object( + Database, + "db_engine_spec", + new_callable=PropertyMock, + return_value=HiveEngineSpec, + ), + patch( + "superset.connectors.sqla.partition_mapping._canary_answers", + return_value=[978343200, 978343200 + 2843], + ), + patch( + "superset.connectors.sqla.partition_validation.QueryContextFactory" + ) as factory, + patch.object(table, "query") as query, + ): + result = validate_partition_data( + table, + mapped_column="event_time", + partition_column="dt_epoch", + value_transform="unix_timestamp(:value) * 1", + partition_values=["3600"], + ) + assert result["status"] == "refused" + assert "Filters will not be mirrored" in str(result["message"]) + factory.assert_not_called() + query.assert_not_called() diff --git a/tests/unit_tests/datasets/schema_tests.py b/tests/unit_tests/datasets/schema_tests.py index a2cf4b7962b5..4f1b9f231a64 100644 --- a/tests/unit_tests/datasets/schema_tests.py +++ b/tests/unit_tests/datasets/schema_tests.py @@ -22,7 +22,10 @@ from marshmallow import ValidationError from pytest_mock import MockerFixture -from superset.datasets.schemas import validate_python_date_format +from superset.datasets.schemas import ( + validate_partition_key, + validate_python_date_format, +) # pylint: disable=too-few-public-methods @@ -449,3 +452,30 @@ def test_import_metric_schema_rejects_invalid_d3format() -> None: } ) assert "d3format" in exc.value.messages + + +@pytest.mark.parametrize( + "key", + ["0", "1768471200", "-9223372036854775808", "9223372036854775807"], +) +def test_validate_partition_key_accepts_64_bit_integers(key: str) -> None: + validate_partition_key(key) + + +@pytest.mark.parametrize( + "key", + [ + "1768471200\n", + " 1", + "1.0", + "", + "-", + "9223372036854775808", + "-9223372036854775809", + "123456789012345678901", + ], +) +def test_validate_partition_key_refuses_anything_else(key: str) -> None: + """A trailing newline passed a `$` anchor; out-of-range keys reached the engine.""" + with pytest.raises(ValidationError): + validate_partition_key(key) diff --git a/tests/unit_tests/models/partition_mirroring_test.py b/tests/unit_tests/models/partition_mirroring_test.py index 3cbc1413584e..823e9038e60c 100644 --- a/tests/unit_tests/models/partition_mirroring_test.py +++ b/tests/unit_tests/models/partition_mirroring_test.py @@ -3282,10 +3282,13 @@ def test_an_array_partition_column_gets_no_mirror(app: Flask) -> None: assert "dt_epoch = 5" in sql +# A comment the owner wrote is inert: it is removed before the probe compiles, +# so it costs neither rows nor pruning. +@pytest.mark.parametrize("comment", ["", " -- floor to the bucket"]) @pytest.mark.parametrize("bucket", [3600, 86400]) @pytest.mark.parametrize("operator", ["==", "IN", ">", ">=", "<", "<=", "range"]) def test_epoch_bucket_queries_preserve_actual_rows( - app: Flask, bucket: int, operator: str + app: Flask, bucket: int, operator: str, comment: str ) -> None: """Execute generated SQL and compare rows against independently built keys.""" import math @@ -3323,6 +3326,7 @@ def test_epoch_bucket_queries_preserve_actual_rows( table = _table( transform=( f"CAST(floor(unix_timestamp(:value) / {bucket}.0) * {bucket} AS BIGINT)" + f"{comment}" ) ) if operator == "range": diff --git a/tests/unit_tests/sql/parse_tests.py b/tests/unit_tests/sql/parse_tests.py index a97dfe376a94..8f2d62e4b1ed 100644 --- a/tests/unit_tests/sql/parse_tests.py +++ b/tests/unit_tests/sql/parse_tests.py @@ -53,6 +53,7 @@ SQLGLOT_DIALECTS, SQLScript, SQLStatement, + strip_comments, Table, tokenize_kql, transpile_to_dialect, @@ -8053,3 +8054,28 @@ def test_get_select_literal_value(sql: str, engine: str, expected: str | None) - def test_has_comment(sql: str, engine: str, expected: bool) -> None: """Check the `has_comment` method.""" assert SQLStatement(sql, engine).has_comment() is expected + + +@pytest.mark.parametrize( + "sql, engine, expected", + [ + ( + "floor(:value / 3600) * 3600 -- hourly", + "hive", + "floor(:value / 3600) * 3600", + ), + ("a/* joined? */+b", "hive", "a +b"), + ( + "concat('a--b', '/* c */', :value)", + "hive", + "concat('a--b', '/* c */', :value)", + ), + ("lower(:value) # trailing", "mysql", "lower(:value)"), + ("-- leading\nlower(:value)", "postgresql", "lower(:value)"), + ("lower(:value)", "base", "lower(:value)"), + ("lower(:value) /* unterminated", "hive", None), + ], +) +def test_strip_comments(sql: str, engine: str, expected: str | None) -> None: + """Comments go, literals and the placeholder stay exactly as written.""" + assert strip_comments(sql, engine) == expected From 148acbf1a730e282fda24e903521992cdfbc08a3 Mon Sep 17 00:00:00 2001 From: Hugh A Miles II Date: Thu, 29 Oct 2026 20:13:36 -0400 Subject: [PATCH 10/11] fix(partition-mapping): two defects found on the running stack - The dataset editor crashed on load: the build lowers `**` to `Math.pow`, which throws on BigInt operands, so the 64-bit key bounds are now spelled out as literals. Jest keeps the native operator, so only the served bundle showed it. - A rejected partition key was reported one character at a time: marshmallow treats a lazy string as a list of messages. The message is now a plain string, and the test checks the message, not only that it raised. Co-Authored-By: Claude Opus 5.5 --- .../PartitionFilterMapping/PartitionDataValidation.tsx | 6 ++++-- superset/datasets/schemas.py | 4 +++- tests/unit_tests/datasets/schema_tests.py | 6 +++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.tsx b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.tsx index eabda4680bdb..8c7009a964fa 100644 --- a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.tsx +++ b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionDataValidation.tsx @@ -39,8 +39,10 @@ interface Props { disabledReason?: string; } -const INT64_MIN = -(BigInt(2) ** BigInt(63)); -const INT64_MAX = BigInt(2) ** BigInt(63) - BigInt(1); +// Spelled out: the build lowers `**` to `Math.pow`, which throws on a BigInt +// as the module loads. +const INT64_MIN = BigInt('-9223372036854775808'); +const INT64_MAX = BigInt('9223372036854775807'); /** A 64-bit integer written as plain digits, as the API accepts it. */ function isPartitionKey(key: string): boolean { diff --git a/superset/datasets/schemas.py b/superset/datasets/schemas.py index d3372655aceb..899ceb615cb3 100644 --- a/superset/datasets/schemas.py +++ b/superset/datasets/schemas.py @@ -110,8 +110,10 @@ def validate_partition_key(value: str) -> None: column can hold is refused here rather than sent to the engine. """ if not _PARTITION_KEY_RE.fullmatch(value) or not (-(2**63) <= int(value) < 2**63): + # `str`, because marshmallow reads a lazy string as a list of messages + # and reports it one character at a time. raise ValidationError( - _("A partition key must be a whole number within the 64-bit range.") + str(_("A partition key must be a whole number within the 64-bit range.")) ) diff --git a/tests/unit_tests/datasets/schema_tests.py b/tests/unit_tests/datasets/schema_tests.py index 4f1b9f231a64..bf803e2872c0 100644 --- a/tests/unit_tests/datasets/schema_tests.py +++ b/tests/unit_tests/datasets/schema_tests.py @@ -477,5 +477,9 @@ def test_validate_partition_key_accepts_64_bit_integers(key: str) -> None: ) def test_validate_partition_key_refuses_anything_else(key: str) -> None: """A trailing newline passed a `$` anchor; out-of-range keys reached the engine.""" - with pytest.raises(ValidationError): + with pytest.raises(ValidationError) as excinfo: validate_partition_key(key) + # One message, not one per character of a lazy string. + assert excinfo.value.messages == [ + "A partition key must be a whole number within the 64-bit range." + ] From baa770d7a62832be938b26faa25aa8019a66d58c Mon Sep 17 00:00:00 2001 From: Hugh A Miles II Date: Fri, 30 Oct 2026 08:41:32 -0400 Subject: [PATCH 11/11] fix(partition-mapping): gate the date-format canary and fill CI gaps - Ask the column's python_date_format canary pair only when its text round-trips as a literal, the same gate every filter value passes. The format is the dataset owner's text; on Hive a backslash closes the literal SQLAlchemy rendered. - strip_comments returns "" for comment-only input, and its re-lex refusal branches are tested, restoring 100% coverage on superset/sql. - Document the refused status and inconclusive_keys in the validation response, and regenerate openapi.json. - The panel says a rejected transform is not mirrored rather than refused, since an operator or engine reason is not a refusal. Co-Authored-By: Claude Opus 5.5 --- .../partition-filter-mapping.mdx | 3 +- docs/static/resources/openapi.json | 10 ++- .../PartitionFilterMapping.test.tsx | 72 ++++++++++--------- .../PartitionMappingSection.tsx | 11 +-- superset/connectors/sqla/partition_mapping.py | 15 ++-- superset/datasets/api.py | 14 +++- superset/sql/parse.py | 3 +- .../translations/ar/LC_MESSAGES/messages.po | 6 +- .../translations/ca/LC_MESSAGES/messages.po | 6 +- .../translations/cs/LC_MESSAGES/messages.po | 6 +- .../translations/de/LC_MESSAGES/messages.po | 6 +- .../translations/en/LC_MESSAGES/messages.po | 6 +- .../translations/es/LC_MESSAGES/messages.po | 6 +- .../translations/fa/LC_MESSAGES/messages.po | 6 +- .../translations/fi/LC_MESSAGES/messages.po | 6 +- .../translations/fr/LC_MESSAGES/messages.po | 6 +- .../translations/it/LC_MESSAGES/messages.po | 6 +- .../translations/ja/LC_MESSAGES/messages.po | 6 +- .../translations/ko/LC_MESSAGES/messages.po | 6 +- .../translations/lv/LC_MESSAGES/messages.po | 6 +- superset/translations/messages.pot | 4 +- .../translations/mi/LC_MESSAGES/messages.po | 6 +- .../translations/nl/LC_MESSAGES/messages.po | 6 +- .../translations/pl/LC_MESSAGES/messages.po | 6 +- .../translations/pt/LC_MESSAGES/messages.po | 6 +- .../pt_BR/LC_MESSAGES/messages.po | 6 +- .../translations/ro/LC_MESSAGES/messages.po | 6 +- .../translations/ru/LC_MESSAGES/messages.po | 6 +- .../translations/sk/LC_MESSAGES/messages.po | 6 +- .../translations/sl/LC_MESSAGES/messages.po | 6 +- .../translations/sr/LC_MESSAGES/messages.po | 6 +- .../sr_Latn/LC_MESSAGES/messages.po | 6 +- .../translations/ta/LC_MESSAGES/messages.po | 6 +- .../translations/th/LC_MESSAGES/messages.po | 6 +- .../translations/tr/LC_MESSAGES/messages.po | 6 +- .../translations/uk/LC_MESSAGES/messages.po | 6 +- .../translations/zh/LC_MESSAGES/messages.po | 6 +- .../zh_TW/LC_MESSAGES/messages.po | 6 +- .../models/partition_mirroring_test.py | 29 ++++++++ tests/unit_tests/sql/parse_tests.py | 21 +++++- 40 files changed, 224 insertions(+), 138 deletions(-) diff --git a/docs/admin_docs/configuration/partition-filter-mapping.mdx b/docs/admin_docs/configuration/partition-filter-mapping.mdx index 90fc76e9ba7f..52e35bb693ab 100644 --- a/docs/admin_docs/configuration/partition-filter-mapping.mdx +++ b/docs/admin_docs/configuration/partition-filter-mapping.mdx @@ -96,7 +96,8 @@ On the same engines, a transform from a timestamp or text column onto a numeric also evaluated at two instants 2,843 seconds apart within one hour. A text column is asked in each common layout (`2001-01-01 10:00:00`, `2001-01-01T10:00:00`, `2001-01-01T10:00:00Z`, and its own datetime format, if set), whether or not it is flagged -as a datetime. If any answers are exactly that far apart in seconds, milliseconds, +as a datetime. A datetime format whose output contains a quote or backslash the engine +would read differently is skipped rather than sent. If any answers are exactly that far apart in seconds, milliseconds, microseconds or nanoseconds, the transform returns raw instants, however it is spelled: `CAST(unix_timestamp(:value) AS BIGINT)`, `unix_timestamp(:value) + 0`, `floor(unix_timestamp(:value))` and `utc_to_unix_micros(:value)` are all declined. A key diff --git a/docs/static/resources/openapi.json b/docs/static/resources/openapi.json index 88b82264068d..cf256bd3320e 100644 --- a/docs/static/resources/openapi.json +++ b/docs/static/resources/openapi.json @@ -25851,6 +25851,13 @@ }, "type": "array" }, + "inconclusive_keys": { + "description": "Partition keys whose rows could not be read, present when the status is inconclusive.", + "items": { + "type": "string" + }, + "type": "array" + }, "message": { "type": "string" }, @@ -25871,7 +25878,8 @@ "not_checked", "matched", "mismatch", - "inconclusive" + "inconclusive", + "refused" ], "type": "string" } diff --git a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionFilterMapping.test.tsx b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionFilterMapping.test.tsx index 7d435dcb5fae..5543f144c918 100644 --- a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionFilterMapping.test.tsx +++ b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionFilterMapping.test.tsx @@ -449,40 +449,48 @@ test('a failed preview shows the error instead of a predicate', async () => { ).not.toBeInTheDocument(); }); -test('a refused transform is not described as mirrored', async () => { - fetchMock.post(PREVIEW_URL, { - result: { - valid: false, - reason: 'unbucketed_epoch', - error: 'Raw epoch conversion does not specify the partition bucket.', - }, - }); +// Not only a safety refusal: an operator or engine the mirror cannot use +// withdraws it too, and the copy must not call either one a refusal. +test.each(['unbucketed_epoch', 'operator'])( + 'a transform the preview rejects for %s is not described as mirrored', + async reason => { + fetchMock.post(PREVIEW_URL, { + result: { + valid: false, + reason, + error: 'The preview rejected this transform.', + }, + }); - render( - , - ); + render( + , + ); - expect( - await screen.findByText('Filters will not be mirrored'), - ).toBeInTheDocument(); - expect( - screen.queryByText( - 'Filters on this column are mirrored onto the partition field.', - ), - ).not.toBeInTheDocument(); - expect(screen.getByText(/this transform is refused/)).toBeInTheDocument(); -}); + expect( + await screen.findByText('Filters will not be mirrored'), + ).toBeInTheDocument(); + expect( + screen.queryByText( + 'Filters on this column are mirrored onto the partition field.', + ), + ).not.toBeInTheDocument(); + expect( + screen.getByText(/with this transform they are not mirrored/), + ).toBeInTheDocument(); + expect(screen.queryByText(/refused/)).not.toBeInTheDocument(); + }, +); test('the column banner does not call a refused mapping mirrored', () => { render( diff --git a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionMappingSection.tsx b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionMappingSection.tsx index 5bc7c1454fc3..06d20acb05c7 100644 --- a/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionMappingSection.tsx +++ b/superset-frontend/src/components/Datasource/components/DatasourceEditor/components/PartitionFilterMapping/PartitionMappingSection.tsx @@ -183,9 +183,10 @@ export default function PartitionMappingSection({ // message appears as it is typed. The same check gates Save from // `DatasourceEditor.validate`, reading the committed record instead. const transformErrors = valueTransformIssues(item, transform); - // A refusal the preview reported, so the copy above it stops promising the - // mirror the alert below withdraws. - const refused = Boolean( + // Any verdict the preview reported against mirroring -- a safety refusal or + // a transform the engine, operator or type cannot mirror -- so the copy above + // it stops promising the mirror the alert below withdraws. + const notMirrored = Boolean( !loading && preview && !preview.valid && preview.reason !== 'unsaved', ); // Data validation compares integer keys. On a text key it can never be @@ -232,9 +233,9 @@ export default function PartitionMappingSection({ - {refused + {notMirrored ? t( - 'Filters on this column are mapped onto the partition field, but this transform is refused, so they are not mirrored.', + 'Filters on this column are mapped onto the partition field, but with this transform they are not mirrored.', ) : isTemporal ? t('Filters on this column are mirrored onto the partition field.') diff --git a/superset/connectors/sqla/partition_mapping.py b/superset/connectors/sqla/partition_mapping.py index fb91e3dc77b7..245942c937f0 100644 --- a/superset/connectors/sqla/partition_mapping.py +++ b/superset/connectors/sqla/partition_mapping.py @@ -1213,18 +1213,20 @@ def _epoch_canaries( if source_type == utils.GenericDataType.TEMPORAL: return list(_EPOCH_CANARIES) if source_type == utils.GenericDataType.STRING: - return _text_epoch_canaries(source) + return _text_epoch_canaries(source, datasource.database) return [] -def _text_epoch_canaries(source: TableColumn) -> list[str]: +def _text_epoch_canaries(source: TableColumn, database: Database) -> list[str]: """ The canaries as the text a timestamp column may hold, one pair per form. Whether or not the column is flagged temporal: ``is_dttm`` defaults to false, and a filter binds the text the author typed either way. A transform parsing one layout answers ``NULL`` for the others, so each common layout - gets a pair, plus the column's own `python_date_format`. + gets a pair, plus the column's own `python_date_format`. That format is the + dataset owner's text, so a pair is asked only when it round-trips as a + literal, the same gate every filter value passes before it reaches a probe. """ formats = ["%Y-%m-%d %H:%M:%S", "%Y-%m-%dT%H:%M:%S", "%Y-%m-%dT%H:%M:%SZ"] date_format = source.python_date_format @@ -1234,7 +1236,12 @@ def _text_epoch_canaries(source: TableColumn) -> list[str]: tuple(canary.strftime(layout) for canary in _EPOCH_CANARIES) for layout in formats ) - return [text for pair in pairs for text in pair] + return [ + text + for pair in pairs + if all(value_round_trips(database, text) for text in pair) + for text in pair + ] def _canary_answers( diff --git a/superset/datasets/api.py b/superset/datasets/api.py index 234a062aaa68..8c4f89c044fa 100644 --- a/superset/datasets/api.py +++ b/superset/datasets/api.py @@ -2240,7 +2240,12 @@ def partition_mapping_preview(self, pk: int) -> Response: properties: status: type: string - enum: [not_checked, matched, mismatch, inconclusive] + enum: + - not_checked + - matched + - mismatch + - inconclusive + - refused checked_rows: type: integer skipped_rows: @@ -2251,6 +2256,13 @@ def partition_mapping_preview(self, pk: int) -> Response: type: integer partitions_requested: type: integer + inconclusive_keys: + type: array + description: >- + Partition keys whose rows could not be read, + present when the status is inconclusive. + items: + type: string message: type: string examples: diff --git a/superset/sql/parse.py b/superset/sql/parse.py index 1537402bca25..897f8751c5c8 100644 --- a/superset/sql/parse.py +++ b/superset/sql/parse.py @@ -285,7 +285,8 @@ def strip_comments(sql: str, engine: str = "base") -> str | None: except Exception: # pylint: disable=broad-except return None if not tokens: - return sql + # Nothing but whitespace and comments: nothing is left once they go. + return "" pieces = [] previous_end = -1 for token in tokens: diff --git a/superset/translations/ar/LC_MESSAGES/messages.po b/superset/translations/ar/LC_MESSAGES/messages.po index d9b8942fe8b8..c469483428d3 100644 --- a/superset/translations/ar/LC_MESSAGES/messages.po +++ b/superset/translations/ar/LC_MESSAGES/messages.po @@ -24,7 +24,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2024-07-14 15:10+0300\n" "Last-Translator: Abdalrahim G. Fakhouri \n" "Language: ar\n" @@ -9085,8 +9085,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/ca/LC_MESSAGES/messages.po b/superset/translations/ca/LC_MESSAGES/messages.po index ff629f156720..d84474cab09a 100644 --- a/superset/translations/ca/LC_MESSAGES/messages.po +++ b/superset/translations/ca/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2025-06-27 12:56+0200\n" "Last-Translator: FULL NAME \n" "Language: ca\n" @@ -8719,8 +8719,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/cs/LC_MESSAGES/messages.po b/superset/translations/cs/LC_MESSAGES/messages.po index e2b7823c5327..0358460f00be 100644 --- a/superset/translations/cs/LC_MESSAGES/messages.po +++ b/superset/translations/cs/LC_MESSAGES/messages.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2016-05-02 08:49-0700\n" "Last-Translator: Jan Šmejkal \n" "Language: cs\n" @@ -8449,8 +8449,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/de/LC_MESSAGES/messages.po b/superset/translations/de/LC_MESSAGES/messages.po index efb09d94d555..37c4f0a6eed1 100644 --- a/superset/translations/de/LC_MESSAGES/messages.po +++ b/superset/translations/de/LC_MESSAGES/messages.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2023-04-07 19:45+0200\n" "Last-Translator: Holger Bruch \n" "Language: de\n" @@ -8263,8 +8263,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/en/LC_MESSAGES/messages.po b/superset/translations/en/LC_MESSAGES/messages.po index 133afcb1f532..c6c69af06fbc 100644 --- a/superset/translations/en/LC_MESSAGES/messages.po +++ b/superset/translations/en/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2016-05-02 08:49-0700\n" "Last-Translator: FULL NAME \n" "Language: en\n" @@ -7692,8 +7692,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/es/LC_MESSAGES/messages.po b/superset/translations/es/LC_MESSAGES/messages.po index 32020fab5a3e..30ea8a05dd36 100644 --- a/superset/translations/es/LC_MESSAGES/messages.po +++ b/superset/translations/es/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2016-05-02 08:49-0700\n" "Last-Translator: FULL NAME \n" "Language: es\n" @@ -8620,8 +8620,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/fa/LC_MESSAGES/messages.po b/superset/translations/fa/LC_MESSAGES/messages.po index d22e93458326..c4f4477648bb 100644 --- a/superset/translations/fa/LC_MESSAGES/messages.po +++ b/superset/translations/fa/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2024-10-20 00:07+0330\n" "Last-Translator: Emad Rad \n" "Language: fa\n" @@ -8759,8 +8759,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/fi/LC_MESSAGES/messages.po b/superset/translations/fi/LC_MESSAGES/messages.po index c268342ef565..828d2016d3bc 100644 --- a/superset/translations/fi/LC_MESSAGES/messages.po +++ b/superset/translations/fi/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: fi\n" @@ -13382,8 +13382,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/fr/LC_MESSAGES/messages.po b/superset/translations/fr/LC_MESSAGES/messages.po index 421f7ecf4411..1b8bfa3a8575 100644 --- a/superset/translations/fr/LC_MESSAGES/messages.po +++ b/superset/translations/fr/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2025-06-26 15:34+0200\n" "Last-Translator: \n" "Language: fr\n" @@ -8386,8 +8386,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/it/LC_MESSAGES/messages.po b/superset/translations/it/LC_MESSAGES/messages.po index 01e3b0d857e4..bf0895ea3dc1 100644 --- a/superset/translations/it/LC_MESSAGES/messages.po +++ b/superset/translations/it/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2018-02-11 22:26+0200\n" "Last-Translator: Raffaele Spangaro \n" "Language: it\n" @@ -10089,8 +10089,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/ja/LC_MESSAGES/messages.po b/superset/translations/ja/LC_MESSAGES/messages.po index ba0d1497feca..3e7db4694e1c 100644 --- a/superset/translations/ja/LC_MESSAGES/messages.po +++ b/superset/translations/ja/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2024-05-14 13:30+0900\n" "Last-Translator: Yuri Umezaki \n" "Language: ja\n" @@ -7702,8 +7702,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/ko/LC_MESSAGES/messages.po b/superset/translations/ko/LC_MESSAGES/messages.po index 22804a85ff84..5f703b85805a 100644 --- a/superset/translations/ko/LC_MESSAGES/messages.po +++ b/superset/translations/ko/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2019-02-02 22:28+0900\n" "Last-Translator: \n" "Language: ko\n" @@ -11924,8 +11924,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/lv/LC_MESSAGES/messages.po b/superset/translations/lv/LC_MESSAGES/messages.po index f18aaefb2c5c..b8b7e1bfc625 100644 --- a/superset/translations/lv/LC_MESSAGES/messages.po +++ b/superset/translations/lv/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2026-03-27 14:01+0200\n" "Last-Translator: FULL NAME \n" "Language: lv\n" @@ -8301,8 +8301,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/messages.pot b/superset/translations/messages.pot index 48ccf57c1dbe..f431ee304347 100644 --- a/superset/translations/messages.pot +++ b/superset/translations/messages.pot @@ -25,7 +25,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -7163,7 +7163,7 @@ msgstr "" msgid "Filters on this column are mapped onto the partition column, but are not mirrored." msgstr "" -msgid "Filters on this column are mapped onto the partition field, but this transform is refused, so they are not mirrored." +msgid "Filters on this column are mapped onto the partition field, but with this transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/mi/LC_MESSAGES/messages.po b/superset/translations/mi/LC_MESSAGES/messages.po index 14f3cc980246..20f9aa35440e 100644 --- a/superset/translations/mi/LC_MESSAGES/messages.po +++ b/superset/translations/mi/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2026-01-25 16:09+1300\n" "Last-Translator: karo.co.nz\n" "Language: mi\n" @@ -8651,8 +8651,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/nl/LC_MESSAGES/messages.po b/superset/translations/nl/LC_MESSAGES/messages.po index affed7f83a67..8500dbd7b432 100644 --- a/superset/translations/nl/LC_MESSAGES/messages.po +++ b/superset/translations/nl/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: superset-ds\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2024-05-08 14:41+0000\n" "Last-Translator: \n" "Language: nl\n" @@ -8941,8 +8941,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/pl/LC_MESSAGES/messages.po b/superset/translations/pl/LC_MESSAGES/messages.po index 9fa09b6adeaf..6fe8e3fece80 100644 --- a/superset/translations/pl/LC_MESSAGES/messages.po +++ b/superset/translations/pl/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2021-11-16 17:33+0100\n" "Last-Translator: FULL NAME \n" "Language: pl\n" @@ -9076,8 +9076,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/pt/LC_MESSAGES/messages.po b/superset/translations/pt/LC_MESSAGES/messages.po index 8685eb0345f6..80d47a756816 100644 --- a/superset/translations/pt/LC_MESSAGES/messages.po +++ b/superset/translations/pt/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2026-07-17 14:21+0000\n" "Last-Translator: José Teixeira \n" "Language: pt\n" @@ -10470,8 +10470,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/pt_BR/LC_MESSAGES/messages.po b/superset/translations/pt_BR/LC_MESSAGES/messages.po index ae5e832dca25..1d90fb304865 100644 --- a/superset/translations/pt_BR/LC_MESSAGES/messages.po +++ b/superset/translations/pt_BR/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2023-05-22 08:04-0400\n" "Last-Translator: \n" "Language: pt_BR\n" @@ -8957,8 +8957,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/ro/LC_MESSAGES/messages.po b/superset/translations/ro/LC_MESSAGES/messages.po index 58a721baa23d..4dbfc1437014 100644 --- a/superset/translations/ro/LC_MESSAGES/messages.po +++ b/superset/translations/ro/LC_MESSAGES/messages.po @@ -22,7 +22,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: ro\n" @@ -8831,8 +8831,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/ru/LC_MESSAGES/messages.po b/superset/translations/ru/LC_MESSAGES/messages.po index 762d058c00ec..d9eb7b038f1e 100644 --- a/superset/translations/ru/LC_MESSAGES/messages.po +++ b/superset/translations/ru/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2026-07-17 09:44+0100\n" "Last-Translator: Daniel Checheta\n" "Language: ru\n" @@ -8179,8 +8179,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/sk/LC_MESSAGES/messages.po b/superset/translations/sk/LC_MESSAGES/messages.po index c4ba5d327163..3e5a84f966ce 100644 --- a/superset/translations/sk/LC_MESSAGES/messages.po +++ b/superset/translations/sk/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2026-05-18 15:42+0200\n" "Last-Translator: FULL NAME \n" "Language: sk\n" @@ -8451,8 +8451,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/sl/LC_MESSAGES/messages.po b/superset/translations/sl/LC_MESSAGES/messages.po index 89aadac06980..f3a5e5191dc2 100644 --- a/superset/translations/sl/LC_MESSAGES/messages.po +++ b/superset/translations/sl/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset\n" "Report-Msgid-Bugs-To: dkrat7 @github.com\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2026-07-29 16:16+0200\n" "Last-Translator: lapor-kris \n" "Language: sl_SI\n" @@ -8430,8 +8430,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/sr/LC_MESSAGES/messages.po b/superset/translations/sr/LC_MESSAGES/messages.po index 5c1f9774d36d..f87e1276f276 100644 --- a/superset/translations/sr/LC_MESSAGES/messages.po +++ b/superset/translations/sr/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2026-06-14 13:20+0200\n" "Last-Translator: FULL NAME \n" "Language: sr\n" @@ -9985,8 +9985,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/sr_Latn/LC_MESSAGES/messages.po b/superset/translations/sr_Latn/LC_MESSAGES/messages.po index aeb8bf282cdb..12a02de75645 100644 --- a/superset/translations/sr_Latn/LC_MESSAGES/messages.po +++ b/superset/translations/sr_Latn/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2026-06-14 13:20+0200\n" "Last-Translator: FULL NAME \n" "Language: sr_Latn\n" @@ -9989,8 +9989,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/ta/LC_MESSAGES/messages.po b/superset/translations/ta/LC_MESSAGES/messages.po index 9477553e58a0..ff6494ef6101 100644 --- a/superset/translations/ta/LC_MESSAGES/messages.po +++ b/superset/translations/ta/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2026-03-31 02:00-0700\n" "Last-Translator: Maazin Ahamed\n" "Language: ta\n" @@ -8231,8 +8231,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/th/LC_MESSAGES/messages.po b/superset/translations/th/LC_MESSAGES/messages.po index 31ec05089221..a4c976abe712 100644 --- a/superset/translations/th/LC_MESSAGES/messages.po +++ b/superset/translations/th/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: th\n" @@ -13188,8 +13188,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/tr/LC_MESSAGES/messages.po b/superset/translations/tr/LC_MESSAGES/messages.po index 5b8d5b0cb9e5..08ace3995239 100644 --- a/superset/translations/tr/LC_MESSAGES/messages.po +++ b/superset/translations/tr/LC_MESSAGES/messages.po @@ -21,7 +21,7 @@ msgid "" msgstr "" "Project-Id-Version: Superset VERSION\n" "Report-Msgid-Bugs-To: avsarcoteli@gmail.com\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2024-02-25 14:00+0300\n" "Last-Translator: FULL NAME \n" "Language: tr\n" @@ -8403,8 +8403,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/uk/LC_MESSAGES/messages.po b/superset/translations/uk/LC_MESSAGES/messages.po index e5017897f3ed..8a4b67e859b3 100644 --- a/superset/translations/uk/LC_MESSAGES/messages.po +++ b/superset/translations/uk/LC_MESSAGES/messages.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: ted.korostiled@gmail.com\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2026-04-30 22:04+0300\n" "Last-Translator: Danylo Korostil\n" "Language: uk\n" @@ -8323,8 +8323,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/zh/LC_MESSAGES/messages.po b/superset/translations/zh/LC_MESSAGES/messages.po index a3066f30b234..5aa342cc5832 100644 --- a/superset/translations/zh/LC_MESSAGES/messages.po +++ b/superset/translations/zh/LC_MESSAGES/messages.po @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: Apache Superset 0.22.1\n" "Report-Msgid-Bugs-To: zhouyao94@qq.com\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2019-01-04 22:19+0800\n" "Last-Translator: cdmikechen\n" "Language: zh\n" @@ -8497,8 +8497,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/superset/translations/zh_TW/LC_MESSAGES/messages.po b/superset/translations/zh_TW/LC_MESSAGES/messages.po index 9419eaf0c5cc..9b6506e6f05c 100644 --- a/superset/translations/zh_TW/LC_MESSAGES/messages.po +++ b/superset/translations/zh_TW/LC_MESSAGES/messages.po @@ -17,7 +17,7 @@ msgid "" msgstr "" "Project-Id-Version: Apache Superset 0.22.1\n" "Report-Msgid-Bugs-To: bestlong168@gmail.com\n" -"POT-Creation-Date: 2026-10-29 23:46+0000\n" +"POT-Creation-Date: 2026-10-30 12:38+0000\n" "PO-Revision-Date: 2019-01-04 22:19+0800\n" "Last-Translator: Shao Yu-Lung \n" "Language: zh_TW\n" @@ -9011,8 +9011,8 @@ msgid "" msgstr "" msgid "" -"Filters on this column are mapped onto the partition field, but this " -"transform is refused, so they are not mirrored." +"Filters on this column are mapped onto the partition field, but with this" +" transform they are not mirrored." msgstr "" msgid "Filters on this column are mirrored onto the partition column." diff --git a/tests/unit_tests/models/partition_mirroring_test.py b/tests/unit_tests/models/partition_mirroring_test.py index 823e9038e60c..c5b827ea103e 100644 --- a/tests/unit_tests/models/partition_mirroring_test.py +++ b/tests/unit_tests/models/partition_mirroring_test.py @@ -3600,3 +3600,32 @@ def probe(database: Any, catalog: Any, schema: Any, transform: str, values: Any) partition_mapping._probe_canaries(MagicMock(), "t(:value)", canaries) is None ) + + +@pytest.mark.parametrize( + "date_format, asked", + [ + ("%d/%m/%Y %H:%M:%S", True), + # Hive reads a backslash escape and ignores a doubled apostrophe, so + # the rendered literal would close early and the rest would run. + ("%Y\\' || reflect('java.lang.Thread', 'sleep', 1) || '", False), + ], +) +def test_a_date_format_reaches_the_probe_only_as_a_literal( + date_format: str, asked: bool +) -> None: + """ + The column's `python_date_format` is the dataset owner's text. Its canary + pair is asked only when it round-trips as a literal, as a filter value must. + """ + from superset.connectors.sqla import partition_mapping + + database = MagicMock() + database.backend = "hive" + source = MagicMock() + source.python_date_format = date_format + + canaries = partition_mapping._text_epoch_canaries(source, database) + + assert len(canaries) == (8 if asked else 6) + assert all(partition_mapping.value_round_trips(database, text) for text in canaries) diff --git a/tests/unit_tests/sql/parse_tests.py b/tests/unit_tests/sql/parse_tests.py index 8f2d62e4b1ed..802bb0be7c11 100644 --- a/tests/unit_tests/sql/parse_tests.py +++ b/tests/unit_tests/sql/parse_tests.py @@ -24,7 +24,7 @@ import pytest import sqlglot from pytest_mock import MockerFixture -from sqlglot import Dialects, exp, parse_one +from sqlglot import Dialect, Dialects, exp, parse_one from superset.exceptions import QueryClauseValidationException, SupersetParseError from superset.jinja_context import JinjaTemplateProcessor @@ -8074,8 +8074,27 @@ def test_has_comment(sql: str, engine: str, expected: bool) -> None: ("-- leading\nlower(:value)", "postgresql", "lower(:value)"), ("lower(:value)", "base", "lower(:value)"), ("lower(:value) /* unterminated", "hive", None), + ("-- only a comment", "hive", ""), + (" ", "hive", ""), ], ) def test_strip_comments(sql: str, engine: str, expected: str | None) -> None: """Comments go, literals and the placeholder stay exactly as written.""" assert strip_comments(sql, engine) == expected + + +@pytest.mark.parametrize("relexed", [ValueError("no"), []]) +def test_strip_comments_refuses_what_does_not_relex_the_same( + mocker: MockerFixture, relexed: Exception | list[object] +) -> None: + """ + The stripped text is lexed again and must give back the same tokens; a + lexer that fails on it, or reads it differently, yields ``None`` rather + than a guess. + """ + tokens = Dialect.get_or_raise("hive").tokenize("lower(:value) -- c") + lexer = mocker.MagicMock() + lexer.tokenize.side_effect = [tokens, relexed] + mocker.patch("superset.sql.parse.Dialect.get_or_raise", return_value=lexer) + + assert strip_comments("lower(:value) -- c", "hive") is None