You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@superset.apache.org by "yuskhan (via GitHub)" <gi...@apache.org> on 2026/10/22 02:22:42 UTC
[PR] feat(native-filters): add Condition filter (column + operator + value) [superset]
yuskhan opened a new pull request, #45599:
URL: https://github.com/apache/superset/pull/45599
### SUMMARY
Adds a **Condition** native filter (`filter_condition`). Dashboard viewers pick an operator and a value for a column, and the condition applies to the scoped charts.
Superset has separate Value and Numerical Range filters, but viewers can't build a condition like `price > 100` or `country IS NULL` themselves. This filter supports `=`, `!=`, `>`, `<`, `>=`, `<=`, `LIKE`, `IN`, `NOT IN`, `IS NULL` and `IS NOT NULL`. The proposal was discussed in apache/superset#42638.
**Design decisions**
- **Built like the Range filter.** It's a new plugin in `src/filters/components/Condition/`, registered next to the other native filters.
- **No backend changes.** The filter emits one `{col, op, val}` clause in `extraFormData.filters`, the same format the other filters use. Scoping, cross-chart updates and SQL generation go through the existing path.
- **Operators depend on the column's type.** The type comes from the filter's own query result, so it follows type changes made in the dataset editor or a semantic layer.
| Column type | Operators offered |
|---|---|
| Text | `=`, `!=`, `IN`, `NOT IN`, `LIKE`, `IS NULL`, `IS NOT NULL` |
| Number | `=`, `!=`, `>`, `<`, `>=`, `<=`, `IN`, `NOT IN`, `IS NULL`, `IS NOT NULL` |
| Date/time | `=`, `!=`, `>`, `<`, `>=`, `<=`, `IS NULL`, `IS NOT NULL` |
| True/false | `=`, `!=`, `IS NULL`, `IS NOT NULL` |
| Array | `IS NULL`, `IS NOT NULL` |
- **Invalid input is never sent to the dashboard.** This covers a non-numeric value on a number column, and a saved operator that no longer fits the column's type. The filter shows an inline error and the last valid condition stays in effect. The filter bar replaces a plugin's `validateStatus` with its own required-value check, so the error is computed and shown inside the plugin. Without this, Apply would become enabled and silently drop an already-applied filter. "Clear all" resets this local input too.
- **Value suggestions.** `=`, `!=`, `IN` and `NOT IN` suggest the column's existing values, and users can also type new ones. Comparisons and `LIKE` use a text input.
- **URL filters.** Rison URL filters (`?f=...`) are mapped onto Condition filters.
### BEFORE/AFTER SCREENSHOTS OR ANIMATED GIF
<img width="960" height="570" alt="conditions-filter-demo" src="https://github.com/user-attachments/assets/013842ef-60c9-4173-b5b9-1aebb237aa5d" />
### TESTING INSTRUCTIONS
**Automated**
- Frontend unit tests:
```
npm run test -- src/filters/components/Condition src/dashboard/util/risonFilters
```
These cover the plugin, value/operator logic, type-aware operators, invalid-input handling, "Clear all", and URL (rison) injection.
- Backend:
```
pytest tests/unit_tests/models/condition_filter_test.py
```
Runs every operator through `get_sqla_query` against a real SQLite table and checks the rows returned. Also checks that `merge_extra_form_data` merges the clause into the chart's filters.
**Manual**
1. Open a dashboard and choose **Add/edit filters**, then **Filter type β Condition filter**. Pick a dataset and a numeric column and save.
2. In the filter bar, choose `>`, type `100` and click **Apply filters**. The scoped charts show only rows with a value over 100.
3. Add a second Condition filter on a text column. Its operator list offers `LIKE` but not `>`. Choose `IS NULL` and apply; both conditions combine.
4. Switch the text filter to `IN`. The value picker suggests existing values.
5. In the numeric filter, type `abc`. An inline error appears, **Apply filters** stays disabled, and the charts keep the previous condition.
6. **Clear all** resets both filters and restores every row.
**Already run on this branch**
- `pre-commit run` passes, including mypy, ruff, oxlint, oxfmt and the frontend type check.
- `tsc --noEmit` reports 0 errors.
- All frontend tests in `src/filters`, `src/dashboard/util/risonFilters` and `src/dashboard/components/nativeFilters` pass.
- 15 backend tests pass.
- Steps 1β6 above were also run with a Playwright script against a live local Superset server.
### ADDITIONAL INFORMATION
- [x] Has associated issue: https://github.com/apache/superset/discussions/42638
- [ ] Required feature flags:
- [x] Changes UI
- [ ] Includes DB Migration (follow approval process in [SIP-59](https://github.com/apache/superset/issues/13351))
- [ ] Migration is atomic, supports rollback & is backwards-compatible
- [ ] Confirm DB migration upgrade and downgrade tested
- [ ] Runtime estimates and downtime expectations provided
- [x] Introduces new feature or API
- [ ] Removes existing feature or API
**Known follow-ups:**
- Replace the placeholder thumbnail, which is a copy of the Range filter's.
- Add a Playwright spec to the repo's own suite.
- Possibly gate the filter behind a feature flag if maintainers prefer.
---
_Generated by [Claude Code](https://claude.ai/code/session_01Lt9yZSaV2MXNcWWF7bkgpb)_
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org
Re: [PR] feat(native-filters): add Condition filter (column + operator + value) [superset]
Posted by "codeant-ai-for-open-source[bot] (via GitHub)" <gi...@apache.org>.
codeant-ai-for-open-source[bot] commented on code in PR #45599:
URL: https://github.com/apache/superset/pull/45599#discussion_r4343983481
##########
superset-frontend/src/filters/components/Condition/utils.ts:
##########
@@ -0,0 +1,218 @@
+/**
+ * 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 {
+ ExtraFormData,
+ QueryObjectFilterClause,
+ ensureIsArray,
+} from '@superset-ui/core';
+import { GenericDataType } from '@apache-superset/core/common';
+import { t } from '@apache-superset/core/translation';
+import {
+ CONDITION_OPERATORS,
+ ConditionOperator,
+ ConditionScalar,
+ ConditionValue,
+ SET_CONDITION_OPERATORS,
+ UNARY_CONDITION_OPERATORS,
+} from './types';
+
+export const isConditionOperator = (op: unknown): op is ConditionOperator =>
+ (CONDITION_OPERATORS as readonly unknown[]).includes(op);
+
+export const isUnaryConditionOperator = (op: ConditionOperator) =>
+ (UNARY_CONDITION_OPERATORS as readonly string[]).includes(op);
+
+export const isSetConditionOperator = (op: ConditionOperator) =>
+ (SET_CONDITION_OPERATORS as readonly string[]).includes(op);
+
+const isBlank = (val: unknown) =>
+ val === undefined || val === null || val === '';
+
+/**
+ * Operators that make sense for a column's generic type. The type comes from
+ * the filter's own query result, so it follows the column if its type changes
+ * in the dataset editor or a semantic layer. An unknown type allows everything
+ * and leaves validation to the database.
+ */
+const OPERATORS_BY_TYPE: Record<GenericDataType, ConditionOperator[]> = {
+ [GenericDataType.String]: [
+ '==',
+ '!=',
+ 'IN',
+ 'NOT IN',
+ 'LIKE',
+ 'IS NULL',
+ 'IS NOT NULL',
+ ],
+ [GenericDataType.Numeric]: [
+ '==',
+ '!=',
+ '>',
+ '<',
+ '>=',
+ '<=',
+ 'IN',
+ 'NOT IN',
+ 'IS NULL',
+ 'IS NOT NULL',
+ ],
+ [GenericDataType.Temporal]: [
+ '==',
+ '!=',
+ '>',
+ '<',
+ '>=',
+ '<=',
+ 'IS NULL',
+ 'IS NOT NULL',
+ ],
+ [GenericDataType.Boolean]: ['==', '!=', 'IS NULL', 'IS NOT NULL'],
+ [GenericDataType.MultiValue]: ['IS NULL', 'IS NOT NULL'],
+};
+
+export function getAllowedOperators(
+ coltype?: GenericDataType | null,
+): ConditionOperator[] {
+ if (coltype === undefined || coltype === null) {
+ return [...CONDITION_OPERATORS];
+ }
+ return OPERATORS_BY_TYPE[coltype] ?? [...CONDITION_OPERATORS];
+}
+
+/**
+ * A condition is complete when it has everything needed to build a clause:
+ * unary operators need nothing, set operators need at least one value and
+ * every other operator needs a single non-blank value.
+ */
+export function isConditionComplete(
+ value?: ConditionValue | null,
+): value is ConditionValue {
+ if (!value || !isConditionOperator(value.op)) {
+ return false;
+ }
+ if (isUnaryConditionOperator(value.op)) {
+ return true;
+ }
+ if (isSetConditionOperator(value.op)) {
+ return ensureIsArray(value.val).some(val => !isBlank(val));
+ }
+ return !Array.isArray(value.val) && !isBlank(value.val);
+}
+
+/**
+ * Values typed into the filter arrive as strings. Cast them to numbers for
+ * numeric columns so comparisons like `>` behave numerically, and true/false
+ * to booleans for boolean columns. LIKE patterns are always left as strings.
+ */
+export function coerceConditionValue(
+ val: ConditionScalar,
+ op: ConditionOperator,
+ coltype?: GenericDataType,
+): ConditionScalar {
+ if (
+ op !== 'LIKE' &&
+ coltype === GenericDataType.Numeric &&
+ typeof val === 'string' &&
+ val.trim() !== '' &&
+ !Number.isNaN(Number(val))
+ ) {
+ return Number(val);
+ }
+ if (coltype === GenericDataType.Boolean && typeof val === 'string') {
+ const lower = val.trim().toLowerCase();
+ if (lower === 'true' || lower === 'false') {
+ return lower === 'true';
+ }
+ }
+ return val;
+}
+
+const isNumeric = (val: unknown) =>
+ typeof val === 'number' ||
+ (typeof val === 'string' && val.trim() !== '' && !Number.isNaN(Number(val)));
Review Comment:
**Suggestion:** `Number('1e309')` yields `Infinity`, which passes this check and is applied as a filter instead of showing the invalid-number error.
**Assessment:** π `Major` Β· π `Occurrence: Rarely` Β· π·οΈ `Incorrect condition logic`
[](https://docs.codeant.ai/cli/resolve-pr-comments-skill) [](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=227bb84ba2cc4aebbb8826ff087258a5&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset) [](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=227bb84ba2cc4aebbb8826ff087258a5&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
<details>
<summary><b>Prompt for AI Agent π€ </b></summary>
```mdx
This is a comment left during a code review.
**Path:** superset-frontend/src/filters/components/Condition/utils.ts
**Line:** 146:148
**Comment:**
*Incorrect Condition Logic: `Number('1e309')` yields `Infinity`, which passes this check and is applied as a filter instead of showing the invalid-number error.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
```
</details>
<a href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45599&comment_hash=9f2aaafe7efba1e873428133ecbb5eb4cc27503409e6a264d6c622f0811a1cde&reaction=like'>π</a> | <a href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45599&comment_hash=9f2aaafe7efba1e873428133ecbb5eb4cc27503409e6a264d6c622f0811a1cde&reaction=dislike'>π</a>
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org
Re: [PR] feat(native-filters): add Condition filter (column + operator + value) [superset]
Posted by "yuskhan (via GitHub)" <gi...@apache.org>.
yuskhan commented on code in PR #45599:
URL: https://github.com/apache/superset/pull/45599#discussion_r4344082541
##########
superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/constants.ts:
##########
@@ -35,6 +35,12 @@ export const FILTER_SUPPORTED_TYPES = {
GenericDataType.Temporal,
],
filter_range: [GenericDataType.Numeric],
+ filter_condition: [
+ GenericDataType.Boolean,
+ GenericDataType.String,
+ GenericDataType.Numeric,
+ GenericDataType.Temporal,
+ ],
Review Comment:
This is on purpose, so I'm leaving it as is. The Condition filter's query groups and orders by the column to suggest values, and several databases can't group or order by array columns. That matches `filter_select`, which also leaves out MultiValue. The MultiValue entry in `OPERATORS_BY_TYPE` is there because the `Record<GenericDataType, β¦>` type needs every key. It also covers a column whose type becomes an array after the filter was set up, which is then limited to null checks. Supporting array columns would need a different query, so I'd rather leave that for a follow-up.
---
_Generated by [Claude Code](https://claude.ai/code)_
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org
Re: [PR] feat(native-filters): add Condition filter (column + operator + value) [superset]
Posted by "codeant-ai-for-open-source[bot] (via GitHub)" <gi...@apache.org>.
codeant-ai-for-open-source[bot] commented on code in PR #45599:
URL: https://github.com/apache/superset/pull/45599#discussion_r4343984741
##########
superset-frontend/src/dashboard/util/risonFilters.ts:
##########
@@ -490,6 +490,11 @@ function convertRisonToNativeValue(
}
return comparator;
+ case 'filter_condition':
+ return Array.isArray(comparator) && !['IN', 'NOT IN'].includes(operator)
+ ? { op: operator, val: comparator[0] }
+ : { op: operator, val: comparator };
Review Comment:
**Suggestion:** A URL `BETWEEN` becomes an unsupported Condition operator while its extra form data still applies both bounds, leaving charts filtered by a condition the control cannot represent.
**Assessment:** π `Major` Β· π `Occurrence: Sometimes` Β· π·οΈ `Api mismatch`
[](https://docs.codeant.ai/cli/resolve-pr-comments-skill) [](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=c5905ea16ec64571947c7e6f0fbb193f&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset) [](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=c5905ea16ec64571947c7e6f0fbb193f&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
<details>
<summary><b>Prompt for AI Agent π€ </b></summary>
```mdx
This is a comment left during a code review.
**Path:** superset-frontend/src/dashboard/util/risonFilters.ts
**Line:** 493:496
**Comment:**
*Api Mismatch: A URL `BETWEEN` becomes an unsupported Condition operator while its extra form data still applies both bounds, leaving charts filtered by a condition the control cannot represent.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
```
</details>
<a href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45599&comment_hash=86b77fe1fbba3147c8cfc9a744b87267326fdad2cd383f791494a14392ef4624&reaction=like'>π</a> | <a href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45599&comment_hash=86b77fe1fbba3147c8cfc9a744b87267326fdad2cd383f791494a14392ef4624&reaction=dislike'>π</a>
##########
superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/constants.ts:
##########
@@ -35,6 +35,12 @@ export const FILTER_SUPPORTED_TYPES = {
GenericDataType.Temporal,
],
filter_range: [GenericDataType.Numeric],
+ filter_condition: [
+ GenericDataType.Boolean,
+ GenericDataType.String,
+ GenericDataType.Numeric,
+ GenericDataType.Temporal,
+ ],
Review Comment:
**Suggestion:** Array columns use `GenericDataType.MultiValue`, which Condition supports for null checks, but this allowlist rejects them, preventing builders from configuring Condition filters for arrays.
**Assessment:** π `Major` Β· π `Occurrence: Sometimes` Β· π·οΈ `Type error`
[](https://docs.codeant.ai/cli/resolve-pr-comments-skill) [](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=c74ffefbe9624787b49e9a5ca50f1389&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset) [](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=c74ffefbe9624787b49e9a5ca50f1389&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
<details>
<summary><b>Prompt for AI Agent π€ </b></summary>
```mdx
This is a comment left during a code review.
**Path:** superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/constants.ts
**Line:** 38:43
**Comment:**
*Type Error: Array columns use `GenericDataType.MultiValue`, which Condition supports for null checks, but this allowlist rejects them, preventing builders from configuring Condition filters for arrays.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
```
</details>
<a href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45599&comment_hash=234e9dd0c3974caf4ec4a7b7fd70824bf50b034d1f762487552f612e70ca16ce&reaction=like'>π</a> | <a href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45599&comment_hash=234e9dd0c3974caf4ec4a7b7fd70824bf50b034d1f762487552f612e70ca16ce&reaction=dislike'>π</a>
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org
Re: [PR] feat(native-filters): add Condition filter (column + operator + value) [superset]
Posted by "codeant-ai-for-open-source[bot] (via GitHub)" <gi...@apache.org>.
codeant-ai-for-open-source[bot] commented on code in PR #45599:
URL: https://github.com/apache/superset/pull/45599#discussion_r4343993744
##########
superset-frontend/src/filters/components/Condition/ConditionFilterPlugin.tsx:
##########
@@ -0,0 +1,347 @@
+/**
+ * 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 { t } from '@apache-superset/core/translation';
+import {
+ AppSection,
+ ensureIsArray,
+ finestTemporalGrainFormatter,
+ getColumnLabel,
+} from '@superset-ui/core';
+import { GenericDataType } from '@apache-superset/core/common';
+import { styled } from '@apache-superset/core/theme';
+import { useCallback, useEffect, useMemo, useState } from 'react';
+import { FormItem, Input, Select } from '@superset-ui/core/components';
+import { FilterBarOrientation } from 'src/dashboard/types';
+import { getDataRecordFormatter } from '../../utils';
+import { FilterPluginStyle, StatusMessage } from '../common';
+import {
+ ConditionOperator,
+ ConditionValue,
+ PluginFilterConditionProps,
+} from './types';
+import {
+ getAllowedOperators,
+ getConditionError,
+ getConditionExtraFormData,
+ getConditionLabel,
+ isConditionComplete,
+ isSetConditionOperator,
+ isUnaryConditionOperator,
+} from './utils';
+
+const OPERATOR_LABELS: Record<ConditionOperator, string> = {
+ '==': '=',
+ '!=': '!=',
+ '>': '>',
+ '<': '<',
+ '>=': '>=',
+ '<=': '<=',
+ LIKE: 'LIKE',
+ IN: 'IN',
+ 'NOT IN': 'NOT IN',
+ 'IS NULL': 'IS NULL',
+ 'IS NOT NULL': 'IS NOT NULL',
+};
+
+// Operators that pick from the column's existing values. The rest are
+// free text (comparisons and LIKE patterns rarely match an existing value).
+const PICKER_OPERATORS: ConditionOperator[] = ['==', '!=', 'IN', 'NOT IN'];
+
+// The Select only takes string or number values. Booleans are shown as
+// strings and cast back by coerceConditionValue.
+const toSelectValue = (value: unknown): string | number =>
+ typeof value === 'number' ? value : String(value);
+
+const Wrapper = styled.div<{ horizontal: boolean }>`
+ display: flex;
+ flex-direction: ${({ horizontal }) => (horizontal ? 'row' : 'column')};
+ gap: ${({ theme }) => theme.sizeUnit * 2}px;
+ width: 100%;
+
+ .condition-operator {
+ min-width: ${({ theme }) => theme.sizeUnit * 30}px;
+ }
+
+ .condition-value {
+ flex: 1;
+ min-width: ${({ theme }) => theme.sizeUnit * 40}px;
+ }
+`;
+
+export default function ConditionFilterPlugin(
+ props: PluginFilterConditionProps,
+) {
+ const {
+ data,
+ coltype,
+ formData,
+ height,
+ width,
+ setDataMask,
+ setFocusedFilter,
+ unsetFocusedFilter,
+ setHoveredFilter,
+ unsetHoveredFilter,
+ setFilterActive,
+ filterState,
+ inputRef,
+ appSection,
+ filterBarOrientation = FilterBarOrientation.Vertical,
+ isOverflowingFilterBar,
+ clearAllTrigger,
+ onClearAllComplete,
+ } = props;
+ const { groupby, enableEmptyFilter, defaultValue } = formData;
+ const [col = ''] = ensureIsArray(groupby).map(getColumnLabel);
+
+ const [condition, setCondition] = useState<ConditionValue>(
+ filterState.value ??
+ defaultValue ?? { op: getAllowedOperators(coltype)[0] },
+ );
+
+ // The filter bar overrides validateStatus with its own required-value
+ // check, so errors about the condition itself are computed and shown here.
+ const conditionError = getConditionError(condition, coltype);
+
+ const updateDataMask = useCallback(
+ (next: ConditionValue, { restored = false } = {}) => {
+ if (getConditionError(next, coltype)) {
+ // While the user is typing, keep the last valid condition so Apply
+ // can't silently drop the filter. A restored condition that no longer
+ // fits the column type is cleared so the charts don't receive it.
+ if (restored) {
+ setDataMask({
+ extraFormData: {},
+ filterState: { value: null, label: '', validateStatus: undefined },
+ });
+ }
+ return;
+ }
+ if (isConditionComplete(next)) {
+ setDataMask({
+ extraFormData: getConditionExtraFormData(col, next, coltype),
+ filterState: {
+ value: next,
+ label: getConditionLabel(col, next),
+ validateStatus: undefined,
+ },
+ });
+ } else if (enableEmptyFilter) {
+ setDataMask({
+ extraFormData: {},
+ filterState: {
+ value: null,
+ label: '',
+ validateStatus: 'error',
+ validateMessage: t('Please enter a condition'),
+ },
+ });
+ } else {
+ setDataMask({
+ extraFormData: {},
+ filterState: { value: null, label: '', validateStatus: undefined },
+ });
+ }
+ },
+ [col, coltype, enableEmptyFilter, setDataMask],
+ );
+
+ const handleChange = useCallback(
+ (next: ConditionValue) => {
+ setCondition(next);
+ updateDataMask(next);
+ },
+ [updateDataMask],
+ );
+
+ // Keep local state in sync with external changes (defaults, "Clear all",
+ // permalinks) and make sure a restored value is applied to the charts.
+ useEffect(() => {
+ const value = filterState.value as ConditionValue | null | undefined;
+ if (isConditionComplete(value)) {
+ setCondition(value);
+ updateDataMask(value, { restored: true });
+ } else if (value === null || value === undefined) {
+ // Cleared from outside: keep the chosen operator, drop the value.
+ setCondition(prev => ({ op: prev.op }));
Review Comment:
**Suggestion:** When `filterState.value` is undefined on mount, this clears the configured `defaultValue` from local state, so the default condition is neither shown nor applied.
**Assessment:** π `Major` Β· π `Occurrence: Rarely` Β· π·οΈ `Logic error`
[](https://docs.codeant.ai/cli/resolve-pr-comments-skill) [](https://app.codeant.ai/fix-in-ide?tool=cursor&prompt_id=57ec89925691433bb40134619f2b40da&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset) [](https://app.codeant.ai/fix-in-ide?tool=vscode-claude&prompt_id=57ec89925691433bb40134619f2b40da&service=github&base_url=https%3A%2F%2Fgithub.com&org=apache&repo=apache%2Fsuperset)
<details>
<summary><b>Prompt for AI Agent π€ </b></summary>
```mdx
This is a comment left during a code review.
**Path:** superset-frontend/src/filters/components/Condition/ConditionFilterPlugin.tsx
**Line:** 182:182
**Comment:**
*Logic Error: When `filterState.value` is undefined on mount, this clears the configured `defaultValue` from local state, so the default condition is neither shown nor applied.
Validate the correctness of the flagged issue. If correct, How can I resolve this? If you propose a fix, implement it and please make it concise.
Once fix is implemented, also check other comments on the same PR, and ask user if the user wants to fix the rest of the comments as well. if said yes, then fetch all the comments validate the correctness and implement a minimal fix
```
</details>
<a href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45599&comment_hash=2f49e5f818414bfcf824e13cfe4d9219f7c40d034222a13b424f30e83fe65827&reaction=like'>π</a> | <a href='https://app.codeant.ai/feedback?pr_url=https%3A%2F%2Fgithub.com%2Fapache%2Fsuperset%2Fpull%2F45599&comment_hash=2f49e5f818414bfcf824e13cfe4d9219f7c40d034222a13b424f30e83fe65827&reaction=dislike'>π</a>
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org
Re: [PR] feat(native-filters): add Condition filter (column + operator + value) [superset]
Posted by "codeant-ai-for-open-source[bot] (via GitHub)" <gi...@apache.org>.
codeant-ai-for-open-source[bot] commented on code in PR #45599:
URL: https://github.com/apache/superset/pull/45599#discussion_r4344085986
##########
superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/constants.ts:
##########
@@ -35,6 +35,12 @@ export const FILTER_SUPPORTED_TYPES = {
GenericDataType.Temporal,
],
filter_range: [GenericDataType.Numeric],
+ filter_condition: [
+ GenericDataType.Boolean,
+ GenericDataType.String,
+ GenericDataType.Numeric,
+ GenericDataType.Temporal,
+ ],
Review Comment:
β
**Customized review instruction saved!**
**Instruction:**
> Do not flag the omission of GenericDataType.MultiValue from filter_condition: its query groups and orders suggested values, which array columns may not support.
**Applied to:**
- `superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/constants.ts`
---
π‘ *To manage or update this instruction, visit: [CodeAnt AI Settings](https://app.codeant.ai/org/settings/learnings)*
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org
Re: [PR] feat(native-filters): add Condition filter (column + operator + value) [superset]
Posted by "yuskhan (via GitHub)" <gi...@apache.org>.
yuskhan commented on code in PR #45599:
URL: https://github.com/apache/superset/pull/45599#discussion_r4344085395
##########
superset-frontend/src/dashboard/util/risonFilters.ts:
##########
@@ -490,6 +490,11 @@ function convertRisonToNativeValue(
}
return comparator;
+ case 'filter_condition':
+ return Array.isArray(comparator) && !['IN', 'NOT IN'].includes(operator)
+ ? { op: operator, val: comparator[0] }
+ : { op: operator, val: comparator };
Review Comment:
Confirmed, fixed in ce07afa. `?f=(price:(between:!(1,10)))` set the filter state to `{op: 'BETWEEN', val: 1}`, which the Condition filter can't show, while both bounds were still applied. A Condition filter only holds one operator, so a URL operator it doesn't support now stays unmatched. It still applies to the charts the same way as a URL filter with no matching native filter, and the filter state no longer disagrees with what's applied. Added a test for it.
---
_Generated by [Claude Code](https://claude.ai/code)_
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org
Re: [PR] feat(native-filters): add Condition filter (column + operator + value) [superset]
Posted by "codeant-ai-for-open-source[bot] (via GitHub)" <gi...@apache.org>.
codeant-ai-for-open-source[bot] commented on PR #45599:
URL: https://github.com/apache/superset/pull/45599#issuecomment-6331276239
## CodeAnt PR Risk: Medium Risk
- The PR needs attention before merging because several condition-filter paths can produce inconsistent or unavailable filter behavior.
- The native-filter type allowlist excludes MultiValue columns, preventing builders from configuring the null-check operators the condition filter supports.
- When filterState.value is undefined, the mount effect discards defaultValue without applying it.
- Rison BETWEEN values become unsupported condition state while the URL filter can still apply both bounds to charts.
- Numeric validation accepts Infinity, so an input such as 1e309 can be applied instead of rejected.
**Assessed commit:** `19e4184d2b36`
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org
Re: [PR] feat(native-filters): add Condition filter (column + operator + value) [superset]
Posted by "codeant-ai-for-open-source[bot] (via GitHub)" <gi...@apache.org>.
codeant-ai-for-open-source[bot] commented on code in PR #45599:
URL: https://github.com/apache/superset/pull/45599#discussion_r4344068481
##########
superset-frontend/src/filters/components/Condition/utils.ts:
##########
@@ -0,0 +1,218 @@
+/**
+ * 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 {
+ ExtraFormData,
+ QueryObjectFilterClause,
+ ensureIsArray,
+} from '@superset-ui/core';
+import { GenericDataType } from '@apache-superset/core/common';
+import { t } from '@apache-superset/core/translation';
+import {
+ CONDITION_OPERATORS,
+ ConditionOperator,
+ ConditionScalar,
+ ConditionValue,
+ SET_CONDITION_OPERATORS,
+ UNARY_CONDITION_OPERATORS,
+} from './types';
+
+export const isConditionOperator = (op: unknown): op is ConditionOperator =>
+ (CONDITION_OPERATORS as readonly unknown[]).includes(op);
+
+export const isUnaryConditionOperator = (op: ConditionOperator) =>
+ (UNARY_CONDITION_OPERATORS as readonly string[]).includes(op);
+
+export const isSetConditionOperator = (op: ConditionOperator) =>
+ (SET_CONDITION_OPERATORS as readonly string[]).includes(op);
+
+const isBlank = (val: unknown) =>
+ val === undefined || val === null || val === '';
+
+/**
+ * Operators that make sense for a column's generic type. The type comes from
+ * the filter's own query result, so it follows the column if its type changes
+ * in the dataset editor or a semantic layer. An unknown type allows everything
+ * and leaves validation to the database.
+ */
+const OPERATORS_BY_TYPE: Record<GenericDataType, ConditionOperator[]> = {
+ [GenericDataType.String]: [
+ '==',
+ '!=',
+ 'IN',
+ 'NOT IN',
+ 'LIKE',
+ 'IS NULL',
+ 'IS NOT NULL',
+ ],
+ [GenericDataType.Numeric]: [
+ '==',
+ '!=',
+ '>',
+ '<',
+ '>=',
+ '<=',
+ 'IN',
+ 'NOT IN',
+ 'IS NULL',
+ 'IS NOT NULL',
+ ],
+ [GenericDataType.Temporal]: [
+ '==',
+ '!=',
+ '>',
+ '<',
+ '>=',
+ '<=',
+ 'IS NULL',
+ 'IS NOT NULL',
+ ],
+ [GenericDataType.Boolean]: ['==', '!=', 'IS NULL', 'IS NOT NULL'],
+ [GenericDataType.MultiValue]: ['IS NULL', 'IS NOT NULL'],
+};
+
+export function getAllowedOperators(
+ coltype?: GenericDataType | null,
+): ConditionOperator[] {
+ if (coltype === undefined || coltype === null) {
+ return [...CONDITION_OPERATORS];
+ }
+ return OPERATORS_BY_TYPE[coltype] ?? [...CONDITION_OPERATORS];
+}
+
+/**
+ * A condition is complete when it has everything needed to build a clause:
+ * unary operators need nothing, set operators need at least one value and
+ * every other operator needs a single non-blank value.
+ */
+export function isConditionComplete(
+ value?: ConditionValue | null,
+): value is ConditionValue {
+ if (!value || !isConditionOperator(value.op)) {
+ return false;
+ }
+ if (isUnaryConditionOperator(value.op)) {
+ return true;
+ }
+ if (isSetConditionOperator(value.op)) {
+ return ensureIsArray(value.val).some(val => !isBlank(val));
+ }
+ return !Array.isArray(value.val) && !isBlank(value.val);
+}
+
+/**
+ * Values typed into the filter arrive as strings. Cast them to numbers for
+ * numeric columns so comparisons like `>` behave numerically, and true/false
+ * to booleans for boolean columns. LIKE patterns are always left as strings.
+ */
+export function coerceConditionValue(
+ val: ConditionScalar,
+ op: ConditionOperator,
+ coltype?: GenericDataType,
+): ConditionScalar {
+ if (
+ op !== 'LIKE' &&
+ coltype === GenericDataType.Numeric &&
+ typeof val === 'string' &&
+ val.trim() !== '' &&
+ !Number.isNaN(Number(val))
+ ) {
+ return Number(val);
+ }
+ if (coltype === GenericDataType.Boolean && typeof val === 'string') {
+ const lower = val.trim().toLowerCase();
+ if (lower === 'true' || lower === 'false') {
+ return lower === 'true';
+ }
+ }
+ return val;
+}
+
+const isNumeric = (val: unknown) =>
+ typeof val === 'number' ||
+ (typeof val === 'string' && val.trim() !== '' && !Number.isNaN(Number(val)));
Review Comment:
β
**CodeAnt verified this suggestion was addressed in subsequent commits and marked this thread resolved** as of `ce07afa`.
Numeric strings are now checked with `Number.isFinite(Number(val))`, so values such as `'1e309'` fail validation instead of being coerced to infinity.
<sub>If that's not right, unresolve this thread and CodeAnt will leave it open.</sub>
<!-- codeant-auto-resolve-reply -->
##########
superset-frontend/src/filters/components/Condition/ConditionFilterPlugin.tsx:
##########
@@ -0,0 +1,347 @@
+/**
+ * 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 { t } from '@apache-superset/core/translation';
+import {
+ AppSection,
+ ensureIsArray,
+ finestTemporalGrainFormatter,
+ getColumnLabel,
+} from '@superset-ui/core';
+import { GenericDataType } from '@apache-superset/core/common';
+import { styled } from '@apache-superset/core/theme';
+import { useCallback, useEffect, useMemo, useState } from 'react';
+import { FormItem, Input, Select } from '@superset-ui/core/components';
+import { FilterBarOrientation } from 'src/dashboard/types';
+import { getDataRecordFormatter } from '../../utils';
+import { FilterPluginStyle, StatusMessage } from '../common';
+import {
+ ConditionOperator,
+ ConditionValue,
+ PluginFilterConditionProps,
+} from './types';
+import {
+ getAllowedOperators,
+ getConditionError,
+ getConditionExtraFormData,
+ getConditionLabel,
+ isConditionComplete,
+ isSetConditionOperator,
+ isUnaryConditionOperator,
+} from './utils';
+
+const OPERATOR_LABELS: Record<ConditionOperator, string> = {
+ '==': '=',
+ '!=': '!=',
+ '>': '>',
+ '<': '<',
+ '>=': '>=',
+ '<=': '<=',
+ LIKE: 'LIKE',
+ IN: 'IN',
+ 'NOT IN': 'NOT IN',
+ 'IS NULL': 'IS NULL',
+ 'IS NOT NULL': 'IS NOT NULL',
+};
+
+// Operators that pick from the column's existing values. The rest are
+// free text (comparisons and LIKE patterns rarely match an existing value).
+const PICKER_OPERATORS: ConditionOperator[] = ['==', '!=', 'IN', 'NOT IN'];
+
+// The Select only takes string or number values. Booleans are shown as
+// strings and cast back by coerceConditionValue.
+const toSelectValue = (value: unknown): string | number =>
+ typeof value === 'number' ? value : String(value);
+
+const Wrapper = styled.div<{ horizontal: boolean }>`
+ display: flex;
+ flex-direction: ${({ horizontal }) => (horizontal ? 'row' : 'column')};
+ gap: ${({ theme }) => theme.sizeUnit * 2}px;
+ width: 100%;
+
+ .condition-operator {
+ min-width: ${({ theme }) => theme.sizeUnit * 30}px;
+ }
+
+ .condition-value {
+ flex: 1;
+ min-width: ${({ theme }) => theme.sizeUnit * 40}px;
+ }
+`;
+
+export default function ConditionFilterPlugin(
+ props: PluginFilterConditionProps,
+) {
+ const {
+ data,
+ coltype,
+ formData,
+ height,
+ width,
+ setDataMask,
+ setFocusedFilter,
+ unsetFocusedFilter,
+ setHoveredFilter,
+ unsetHoveredFilter,
+ setFilterActive,
+ filterState,
+ inputRef,
+ appSection,
+ filterBarOrientation = FilterBarOrientation.Vertical,
+ isOverflowingFilterBar,
+ clearAllTrigger,
+ onClearAllComplete,
+ } = props;
+ const { groupby, enableEmptyFilter, defaultValue } = formData;
+ const [col = ''] = ensureIsArray(groupby).map(getColumnLabel);
+
+ const [condition, setCondition] = useState<ConditionValue>(
+ filterState.value ??
+ defaultValue ?? { op: getAllowedOperators(coltype)[0] },
+ );
+
+ // The filter bar overrides validateStatus with its own required-value
+ // check, so errors about the condition itself are computed and shown here.
+ const conditionError = getConditionError(condition, coltype);
+
+ const updateDataMask = useCallback(
+ (next: ConditionValue, { restored = false } = {}) => {
+ if (getConditionError(next, coltype)) {
+ // While the user is typing, keep the last valid condition so Apply
+ // can't silently drop the filter. A restored condition that no longer
+ // fits the column type is cleared so the charts don't receive it.
+ if (restored) {
+ setDataMask({
+ extraFormData: {},
+ filterState: { value: null, label: '', validateStatus: undefined },
+ });
+ }
+ return;
+ }
+ if (isConditionComplete(next)) {
+ setDataMask({
+ extraFormData: getConditionExtraFormData(col, next, coltype),
+ filterState: {
+ value: next,
+ label: getConditionLabel(col, next),
+ validateStatus: undefined,
+ },
+ });
+ } else if (enableEmptyFilter) {
+ setDataMask({
+ extraFormData: {},
+ filterState: {
+ value: null,
+ label: '',
+ validateStatus: 'error',
+ validateMessage: t('Please enter a condition'),
+ },
+ });
+ } else {
+ setDataMask({
+ extraFormData: {},
+ filterState: { value: null, label: '', validateStatus: undefined },
+ });
+ }
+ },
+ [col, coltype, enableEmptyFilter, setDataMask],
+ );
+
+ const handleChange = useCallback(
+ (next: ConditionValue) => {
+ setCondition(next);
+ updateDataMask(next);
+ },
+ [updateDataMask],
+ );
+
+ // Keep local state in sync with external changes (defaults, "Clear all",
+ // permalinks) and make sure a restored value is applied to the charts.
+ useEffect(() => {
+ const value = filterState.value as ConditionValue | null | undefined;
+ if (isConditionComplete(value)) {
+ setCondition(value);
+ updateDataMask(value, { restored: true });
+ } else if (value === null || value === undefined) {
+ // Cleared from outside: keep the chosen operator, drop the value.
+ setCondition(prev => ({ op: prev.op }));
Review Comment:
β
**CodeAnt verified this suggestion was addressed in subsequent commits and marked this thread resolved** as of `ce07afa`.
When `filterState.value` is undefined and Clear All is not active, the effect now restores a complete `defaultValue` to local state and applies it to the charts.
<sub>If that's not right, unresolve this thread and CodeAnt will leave it open.</sub>
<!-- codeant-auto-resolve-reply -->
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org
Re: [PR] feat(native-filters): add Condition filter (column + operator + value) [superset]
Posted by "codecov[bot] (via GitHub)" <gi...@apache.org>.
codecov[bot] commented on PR #45599:
URL: https://github.com/apache/superset/pull/45599#issuecomment-6331966823
## [Codecov](https://app.codecov.io/gh/apache/superset/pull/45599?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) Report
:x: Patch coverage is `93.75000%` with `14 lines` in your changes missing coverage. Please review.
:white_check_mark: Project coverage is 65.31%. Comparing base ([`4e5d0ef`](https://app.codecov.io/gh/apache/superset/commit/4e5d0ef8f13d1b878801851e1801f9672ef155e4?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)) to head ([`24fae26`](https://app.codecov.io/gh/apache/superset/commit/24fae26aea8fe8ab60333f9c71659c33f3a665c3?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)).
| [Files with missing lines](https://app.codecov.io/gh/apache/superset/pull/45599?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Patch % | Lines |
|---|---|---|
| [...ers/components/Condition/ConditionFilterPlugin.tsx](https://app.codecov.io/gh/apache/superset/pull/45599?src=pr&el=tree&filepath=superset-frontend%2Fsrc%2Ffilters%2Fcomponents%2FCondition%2FConditionFilterPlugin.tsx&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3VwZXJzZXQtZnJvbnRlbmQvc3JjL2ZpbHRlcnMvY29tcG9uZW50cy9Db25kaXRpb24vQ29uZGl0aW9uRmlsdGVyUGx1Z2luLnRzeA==) | 90.26% | [11 Missing :warning: ](https://app.codecov.io/gh/apache/superset/pull/45599?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
| [...perset-frontend/src/dashboard/util/risonFilters.ts](https://app.codecov.io/gh/apache/superset/pull/45599?src=pr&el=tree&filepath=superset-frontend%2Fsrc%2Fdashboard%2Futil%2FrisonFilters.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3VwZXJzZXQtZnJvbnRlbmQvc3JjL2Rhc2hib2FyZC91dGlsL3Jpc29uRmlsdGVycy50cw==) | 85.71% | [1 Missing :warning: ](https://app.codecov.io/gh/apache/superset/pull/45599?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
| [...frontend/src/filters/components/Condition/index.ts](https://app.codecov.io/gh/apache/superset/pull/45599?src=pr&el=tree&filepath=superset-frontend%2Fsrc%2Ffilters%2Fcomponents%2FCondition%2Findex.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3VwZXJzZXQtZnJvbnRlbmQvc3JjL2ZpbHRlcnMvY29tcG9uZW50cy9Db25kaXRpb24vaW5kZXgudHM=) | 75.00% | [1 Missing :warning: ](https://app.codecov.io/gh/apache/superset/pull/45599?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
| [...src/filters/components/Condition/transformProps.ts](https://app.codecov.io/gh/apache/superset/pull/45599?src=pr&el=tree&filepath=superset-frontend%2Fsrc%2Ffilters%2Fcomponents%2FCondition%2FtransformProps.ts&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-c3VwZXJzZXQtZnJvbnRlbmQvc3JjL2ZpbHRlcnMvY29tcG9uZW50cy9Db25kaXRpb24vdHJhbnNmb3JtUHJvcHMudHM=) | 91.66% | [1 Missing :warning: ](https://app.codecov.io/gh/apache/superset/pull/45599?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
> :exclamation: There is a different number of reports uploaded between BASE (4e5d0ef) and HEAD (24fae26). Click for more details.
>
> <details><summary>HEAD has 4 uploads less than BASE</summary>
>
>| Flag | BASE (4e5d0ef) | HEAD (24fae26) |
>|------|------|------|
>|python|7|3|
></details>
<details><summary>Additional details and impacted files</summary>
```diff
@@ Coverage Diff @@
## master #45599 +/- ##
===========================================
- Coverage 84.10% 65.31% -18.80%
===========================================
Files 3056 3063 +7
Lines 201285 201508 +223
Branches 47066 47165 +99
===========================================
- Hits 169299 131606 -37693
- Misses 28747 66945 +38198
+ Partials 3239 2957 -282
```
| [Flag](https://app.codecov.io/gh/apache/superset/pull/45599/flags?src=pr&el=flags&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Coverage Ξ | |
|---|---|---|
| [hive](https://app.codecov.io/gh/apache/superset/pull/45599/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `34.89% <ΓΈ> (ΓΈ)` | |
| [javascript](https://app.codecov.io/gh/apache/superset/pull/45599/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `80.18% <93.75%> (+0.01%)` | :arrow_up: |
| [mysql](https://app.codecov.io/gh/apache/superset/pull/45599/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
| [postgres](https://app.codecov.io/gh/apache/superset/pull/45599/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
| [presto](https://app.codecov.io/gh/apache/superset/pull/45599/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `36.62% <ΓΈ> (ΓΈ)` | |
| [python](https://app.codecov.io/gh/apache/superset/pull/45599/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `52.73% <ΓΈ> (-34.62%)` | :arrow_down: |
| [sqlite](https://app.codecov.io/gh/apache/superset/pull/45599/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `52.62% <ΓΈ> (ΓΈ)` | |
| [unit](https://app.codecov.io/gh/apache/superset/pull/45599/flags?src=pr&el=flag&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | `?` | |
Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#carryforward-flags-in-the-pull-request-comment) to find out more.
</details>
[:umbrella: View full report in Codecov by Harness](https://app.codecov.io/gh/apache/superset/pull/45599?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache).
:loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache).
<details><summary> :rocket: New features to boost your workflow: </summary>
- :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
- :package: [JS Bundle Analysis](https://docs.codecov.com/docs/javascript-bundle-analysis): Save yourself from yourself by tracking and limiting bundle sizes in JS merges.
</details>
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org