You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@superset.apache.org by "natcharam (via GitHub)" <gi...@apache.org> on 2025/07/28 20:43:30 UTC

[D] How to use Jinja template for "Inverse Selection" filter type [superset]

GitHub user natcharam created a discussion: How to use Jinja template for "Inverse Selection" filter type

I need help with Jinja templating for handling "Inverse Selection" filter type in SQL Lab/Dataset.

Setup:
I have 2 filters for the same column CAMPAIGN_GROUP:

Normal filter (Filter Type: "Filter") - works fine
Inverse Selection filter (Filter Type: "Inverse Selection") - need help with this

**What Works - Normal Filter:**
```
{% if filter_values('DEVICE_TYPE') %}
  AND DEVICE_TYPE IN {{ filter_values('DEVICE_TYPE') | where_in }}
{% endif %}
{% if filter_values('CAMPAIGN_GROUP') %}
  AND CAMPAIGN_GROUP IN {{ filter_values('CAMPAIGN_GROUP') | where_in }}
{% endif %}
```

**Problem:**
- How do I write the Jinja template to handle the "Inverse Selection" filter type?
- The inverse selection filter appears in the dashboard with the same column name CAMPAIGN_GROUP, but I need it to generate NOT IN logic instead of IN.

**Questions:**
- How can I distinguish between the normal filter and inverse selection filter in Jinja templates when they use the same column?
- Is there a different function to call for inverse selection filters?
- Does filter_values() work differently for inverse selection filter types?
- Should the inverse selection filter automatically generate NOT IN logic, or do I need to handle this manually?

**Expected Behavior:**
```
-- Normal filter should generate:
AND CAMPAIGN_GROUP IN ('value1', 'value2')

-- Inverse Selection filter should generate:
AND CAMPAIGN_GROUP NOT IN ('excluded1', 'excluded2')
```

**Additional Context:**
- Both filters target the same CAMPAIGN_GROUP column
- Users need both include and exclude functionality

GitHub link: https://github.com/apache/superset/discussions/34372

----
This is an automatically sent email for notifications@superset.apache.org.
To unsubscribe, please send an email to: notifications-unsubscribe@superset.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org


Re: [D] How to use Jinja template for "Inverse Selection" filter type [superset]

Posted by "dosubot[bot] (via GitHub)" <gi...@apache.org>.
GitHub user dosubot[bot] added a comment to the discussion: How to use Jinja template for "Inverse Selection" filter type

<!-- Greeting -->
Hi @natcharam! I'm [Dosu](https://go.dosu.dev/dosubot) and I’m helping the superset team.

<!-- Answer -->
To handle both normal and "Inverse Selection" filters for the same column in a Jinja template, use the get_filters() macro instead of filter_values(). The get_filters() macro exposes the filter operator (IN or NOT IN), so you can generate the correct SQL logic for each filter type. Here’s how you can do it:

```jinja
{% for filter in get_filters('CAMPAIGN_GROUP') %}
  {% if filter.op == 'IN' %}
    AND CAMPAIGN_GROUP IN ({{ "'" + "', '".join(filter.val) + "'" }})
  {% elif filter.op == 'NOT IN' %}
    AND CAMPAIGN_GROUP NOT IN ({{ "'" + "', '".join(filter.val) + "'" }})
  {% endif %}
{% endfor %}
```

This approach works because get_filters() returns a list of filters for the column, each with an op field (like 'IN' or 'NOT IN') and a val field (the values). You can loop through them and generate the appropriate SQL for each filter type. 

filter_values() does not distinguish between filter types and will not handle NOT IN logic automatically—you need to use get_filters() for this use case. The NOT IN logic is not generated automatically; you must handle it in your template as shown above. See the code and docstring for get_filters() for more details and examples on this pattern  
[here](https://github.com/apache/superset/blob/829e4d92d91ceae4b43b1ed3b063ffe45377799c/superset/jinja_context.py).


<!-- Dosu Comment Footer -->
*To reply, just mention [@dosu](https://go.dosu.dev/dosubot).*

---
<sup>How did I do? [Good](https://app.dosu.dev/response-feedback/5c6a2690-517c-4e8e-ba27-2f28269c08db?feedback_type=great_response) | [Irrelevant](https://app.dosu.dev/response-feedback/5c6a2690-517c-4e8e-ba27-2f28269c08db?feedback_type=irrelevant_answer) | [Incorrect](https://app.dosu.dev/response-feedback/5c6a2690-517c-4e8e-ba27-2f28269c08db?feedback_type=incorrect_sources) | [Verbose](https://app.dosu.dev/response-feedback/5c6a2690-517c-4e8e-ba27-2f28269c08db?feedback_type=too_verbose) | [Hallucination](https://app.dosu.dev/response-feedback/5c6a2690-517c-4e8e-ba27-2f28269c08db?feedback_type=hallucination) | [Report 🐛](https://app.dosu.dev/response-feedback/5c6a2690-517c-4e8e-ba27-2f28269c08db?feedback_type=bug_report) | [Other](https://app.dosu.dev/response-feedback/5c6a2690-517c-4e8e-ba27-2f28269c08db?feedback_type=other)</sup>&nbsp;&nbsp;[![Chat with Dosu](https://dosu.dev/dosu-chat-badge.svg)](https://app.dosu.dev/a28d3c7e-a9d3-459e-9fb6-3a6f9ff4f357/ask?utm_source=github)&
 nbsp;[![Join Discord](https://img.shields.io/badge/join-5865F2?logo=discord&logoColor=white&label=)](https://go.dosu.dev/discord-bot)&nbsp;[![Share on X](https://img.shields.io/badge/X-share-black)](https://twitter.com/intent/tweet?text=%40dosu_ai%20helped%20me%20solve%20this%20issue!&url=https%3A//github.com/apache/superset/discussions/34372)

GitHub link: https://github.com/apache/superset/discussions/34372#discussioncomment-13914730

----
This is an automatically sent email for notifications@superset.apache.org.
To unsubscribe, please send an email to: notifications-unsubscribe@superset.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org


Re: [D] How to use Jinja template for "Inverse Selection" filter type [superset]

Posted by "dosubot[bot] (via GitHub)" <gi...@apache.org>.
GitHub user dosubot[bot] edited a comment on the discussion: How to use Jinja template for "Inverse Selection" filter type

<!-- Greeting -->
Hi @natcharam! I'm [Dosu](https://go.dosu.dev/dosubot) and I’m helping the superset team.

<!-- Answer -->
To handle both normal and "Inverse Selection" filters for the same column in a Jinja template, use the get_filters() macro instead of filter_values(). The get_filters() macro exposes the filter operator (IN or NOT IN), so you can generate the correct SQL logic for each filter type. Here’s how you can do it:

```jinja
{% for filter in get_filters('CAMPAIGN_GROUP') %}
  {% if filter.op == 'IN' %}
    AND CAMPAIGN_GROUP IN ({{ "'" + "', '".join(filter.val) + "'" }})
  {% elif filter.op == 'NOT IN' %}
    AND CAMPAIGN_GROUP NOT IN ({{ "'" + "', '".join(filter.val) + "'" }})
  {% endif %}
{% endfor %}
```

This approach works because get_filters() returns a list of filters for the column, each with an op field (like 'IN' or 'NOT IN') and a val field (the values). You can loop through them and generate the appropriate SQL for each filter type. 

filter_values() does not distinguish between filter types and will not handle NOT IN logic automatically—you need to use get_filters() for this use case. The NOT IN logic is not generated automatically; you must handle it in your template as shown above. See the code and docstring for get_filters() for more details and examples on this pattern  
[here](https://github.com/apache/superset/blob/829e4d92d91ceae4b43b1ed3b063ffe45377799c/superset/jinja_context.py).


<!-- Dosu Comment Footer -->
*To reply, just mention [@dosu](https://go.dosu.dev/dosubot?utm_source=github&utm_medium=bot-comment&utm_campaign=github-comment-footer-20260415&utm_content=reply-with-mention&utm_term=apache%2Fsuperset).*

---

Docs are dead. Just use [Dosu](https://dosu.dev?utm_source=github&utm_medium=bot-comment&utm_campaign=github-comment-footer-20260415&utm_content=static-docs-tagline&utm_term=apache%2Fsuperset).

[![Leave Feedback](https://img.shields.io/badge/Leave%20Feedback-555555?style=flat)](https://app.dosu.dev/response-feedback?utm_source=github&utm_medium=bot-comment&utm_campaign=github-comment-footer-20260415&utm_content=static-docs-feedback&utm_term=apache%2Fsuperset&message_id=5c6a2690-517c-4e8e-ba27-2f28269c08db) [![Ask Dosu about superset](https://img.shields.io/badge/Ask%20Dosu%20about%20superset-2f7b3f?style=flat&logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB3aWR0aD0iODYiIGhlaWdodD0iODkiIHZpZXdCb3g9IjAgMCA4NiA4OSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNNS4yOTIzNiAxMi43OTI4TDE3Ljc1OTMgNi42ODE4OFY3Mi41NjY3TDUuMjkyMzYgODQuMDYxOFYxMi43OTI4WiIgZmlsbD0iI0I0QkI5MSIvPjxwYXRoIGQ9Ik0xOC4yNTc1IDczLjExOTZMNTkuMTMyOSA3Mi43NDhMNTEuNzAxMSA4Mi40MDk1TDI5LjAzMzggODYuMjkxTDYuMjM5NjIgODUuMTU1NEwxOC4yNTc1IDczLjExOTZaIiBmaWxsPSIjNzc4NTYxIi8%2BPHBhdGggZD0iTTE3LjQ5MTYgMy43MzYzM0wzLjU4NTU3IDEyLjcwOTlWODMuNTc5MkMzLjU4NTU3IDg0Ljc1NDIgNC45ODU2MyA4NS4zNjUyIDUuODQ3MDUg
 ODQuNTY2TDE5LjYyOTYgNzEuNzgwMSIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSI2LjQyODQ0IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48bWFzayBpZD0iZG9zdS1kLWN1dG91dCIgZmlsbD0id2hpdGUiPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNDAuNzA0IDAuNTE4MDY2SDE3LjA0MzlWNzYuMjIyMUg0MC43MDRINDIuNTgwNUg0Ny44MDEzQzY4LjcwNjQgNzYuMjIyMSA4NS42NTMzIDU5LjI3NTIgODUuNjUzMyAzOC4zNzAxQzg1LjY1MzMgMTcuNDY1IDY4LjcwNjMgMC41MTgwNjYgNDcuODAxMyAwLjUxODA2Nkg0Mi41ODA1SDQwLjcwNFoiLz48L21hc2s%2BPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MC43MDQgMC41MTgwNjZIMTcuMDQzOVY3Ni4yMjIxSDQwLjcwNEg0Mi41ODA1SDQ3LjgwMTNDNjguNzA2NCA3Ni4yMjIxIDg1LjY1MzMgNTkuMjc1MiA4NS42NTMzIDM4LjM3MDFDODUuNjUzMyAxNy40NjUgNjguNzA2MyAwLjUxODA2NiA0Ny44MDEzIDAuNTE4MDY2SDQyLjU4MDVINDAuNzA0WiIgZmlsbD0iI0YzRjZGMSIvPjxwYXRoIGQ9Ik0xNy4wNDM5IDAuNTE4MDY2Vi02LjU3OTE5SDkuOTQ2NjlWMC41MTgwNjZIMTcuMDQzOVpNMTcuMDQzOSA3Ni4yMjIxSDkuOTQ2NjlWODMuMzE5NEgxNy4wNDM5Vjc2LjIyMjFaTTE3LjA0MzkgNy42MTUzMkg0MC43MDRWLTYuNTc5MTlIMTcuMDQzOVY3LjYxNTMyWk0
 yNC4xNDEyIDc2LjIyMjFWMC41MTgwNjZIOS45NDY2OVY3Ni4yMjIxSDI0LjE0MTJaTTQwLjcwNCA2OS4xMjQ5SDE3LjA0MzlWODMuMzE5NEg0MC43MDRWNjkuMTI0OVpNNDIuNTgwNSA2OS4xMjQ5SDQwLjcwNFY4My4zMTk0SDQyLjU4MDVWNjkuMTI0OVpNNDcuODAxMyA2OS4xMjQ5SDQyLjU4MDVWODMuMzE5NEg0Ny44MDEzVjY5LjEyNDlaTTc4LjU1NiAzOC4zNzAxQzc4LjU1NiA1NS4zNTU1IDY0Ljc4NjcgNjkuMTI0OSA0Ny44MDEzIDY5LjEyNDlWODMuMzE5NEM3Mi42MjYxIDgzLjMxOTQgOTIuNzUwNSA2My4xOTQ5IDkyLjc1MDUgMzguMzcwMUg3OC41NTZaTTQ3LjgwMTMgNy42MTUzMkM2NC43ODY2IDcuNjE1MzIgNzguNTU2IDIxLjM4NDcgNzguNTU2IDM4LjM3MDFIOTIuNzUwNUM5Mi43NTA1IDEzLjU0NTMgNzIuNjI2IC02LjU3OTE5IDQ3LjgwMTMgLTYuNTc5MTlWNy42MTUzMlpNNDIuNTgwNSA3LjYxNTMySDQ3LjgwMTNWLTYuNTc5MTlINDIuNTgwNVY3LjYxNTMyWk00MC43MDQgNy42MTUzMkg0Mi41ODA1Vi02LjU3OTE5SDQwLjcwNFY3LjYxNTMyWiIgZmlsbD0iYmxhY2siIG1hc2s9InVybCgjZG9zdS1kLWN1dG91dCkiLz48cGF0aCBkPSJNNjguOTIxNSAzNi4wMTM1QzY4LjkyMTUgMzYuMDEzNSA2NS43MzY5IDQ5LjQ3MzggNTEuNDIzMSA0OS40NzM4QzM3LjEwOTMgNDkuNDczOCAzMi41Nzg3IDM3LjM1OTYgMzIuNTc4NyAzNi4wMTM1IiBzdHJva2U9ImJsYWNrIiBzdHJva2Utd2lkdGg9IjcuNjkxNjEi
 IHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjxwYXRoIGQ9Ik0wLjM0ODYzMyA4NS40OTQ2QzAuMzQ4NjMzIDg1LjQ5NDYgMjkuNDg1NiA4NS44MzA5IDM0LjgwOSA4NS42OThDNDQuODMzNyA4NS40NDc3IDUxLjI4NzIgODQuNDAyIDU3LjUyNjkgNzguOTcyNEM2Mi44MTI5IDc0LjM3MjcgNzUuMTM0MiA1OS42ODM2IDc1LjEzNDIgNTkuNjgzNiIgc3Ryb2tlPSJibGFjayIgc3Ryb2tlLXdpZHRoPSI2LjE2NDgyIi8%2BPC9zdmc%2B)](https://github.dosu.com/apache/superset?utm_source=github&utm_medium=bot-comment&utm_campaign=github-comment-footer-20260415&utm_content=static-docs-ask-repo&utm_term=apache%2Fsuperset) [![Share Dosu with your team](https://img.shields.io/badge/Share%20Dosu%20with%20your%20team-1f6feb?style=flat)](https://app.dosu.dev/signup?referrer=openSource&source=github-footer&utm_source=github&utm_medium=bot-comment&utm_campaign=github-comment-footer-20260415&utm_content=static-docs-share-team&utm_term=apache%2Fsuperset)

GitHub link: https://github.com/apache/superset/discussions/34372#discussioncomment-13914730

----
This is an automatically sent email for notifications@superset.apache.org.
To unsubscribe, please send an email to: notifications-unsubscribe@superset.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@superset.apache.org
For additional commands, e-mail: notifications-help@superset.apache.org