You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by be...@apache.org on 2026/01/26 19:40:01 UTC
(superset) 01/02: Fix filter
This is an automated email from the ASF dual-hosted git repository.
beto pushed a commit to branch semantic-layer-implementation
in repository https://gitbox.apache.org/repos/asf/superset.git
commit b437421a8edac1b7845a0bb72501f8e707d56617
Author: Beto Dealmeida <ro...@dealmeida.net>
AuthorDate: Thu Dec 11 15:06:13 2025 -0500
Fix filter
---
superset/semantic_layers/mapper.py | 65 +++++++++++++++-------
.../semantic_layers/snowflake/semantic_view.py | 5 --
2 files changed, 46 insertions(+), 24 deletions(-)
diff --git a/superset/semantic_layers/mapper.py b/superset/semantic_layers/mapper.py
index 5c4896d395..f6bfbeb0fb 100644
--- a/superset/semantic_layers/mapper.py
+++ b/superset/semantic_layers/mapper.py
@@ -277,6 +277,8 @@ def map_query_object(query_object: ValidatedQueryObject) -> list[SemanticQuery]:
This function maps the `QueryObject` into query objects that focus less on
visualization and more on semantics.
"""
+ print("BETO")
+ print(query_object)
semantic_view = query_object.datasource.implementation
all_metrics = {metric.name: metric for metric in semantic_view.metrics}
@@ -321,6 +323,7 @@ def map_query_object(query_object: ValidatedQueryObject) -> list[SemanticQuery]:
time_offset,
all_dimensions,
)
+ print(">>", filters)
queries.append(
SemanticQuery(
@@ -373,9 +376,15 @@ def _get_filters_from_query_object(
# 4. Add all other filters from query_object.filter
for filter_ in query_object.filter:
- converted_filter = _convert_query_object_filter(filter_, all_dimensions)
- if converted_filter:
- filters.add(converted_filter)
+ # Skip temporal range filters - we're using inner bounds instead
+ if (
+ filter_.get("op") == FilterOperator.TEMPORAL_RANGE.value
+ and query_object.granularity
+ ):
+ continue
+
+ if converted_filters := _convert_query_object_filter(filter_, all_dimensions):
+ filters.update(converted_filters)
return filters
@@ -503,17 +512,12 @@ def _get_time_bounds(
def _convert_query_object_filter(
filter_: ValidatedQueryObjectFilterClause,
all_dimensions: dict[str, Dimension],
-) -> Filter | AdhocFilter | None:
+) -> set[Filter] | None:
"""
Convert a QueryObject filter dict to a semantic layer Filter or AdhocFilter.
"""
operator_str = filter_["op"]
- # Handle TEMPORAL_RANGE filters (these are already handled by _get_time_filter)
- if operator_str == FilterOperator.TEMPORAL_RANGE.value:
- # Skip - already handled in _get_time_filter
- return None
-
# Handle simple column filters
col = filter_.get("col")
if col not in all_dimensions:
@@ -530,6 +534,25 @@ def _convert_query_object_filter(
else:
value = val_str
+ # Special case for temporal range
+ if operator_str == FilterOperator.TEMPORAL_RANGE.value:
+ # XXX
+ start, end = value.split(" : ")
+ return {
+ Filter(
+ type=PredicateType.WHERE,
+ column=dimension,
+ operator=Operator.GREATER_THAN_OR_EQUAL,
+ value=start,
+ ),
+ Filter(
+ type=PredicateType.WHERE,
+ column=dimension,
+ operator=Operator.LESS_THAN,
+ value=end,
+ ),
+ }
+
# Map QueryObject operators to semantic layer operators
operator_mapping = {
FilterOperator.EQUALS.value: Operator.EQUALS,
@@ -551,12 +574,14 @@ def _convert_query_object_filter(
# Unknown operator - create adhoc filter
return None
- return Filter(
- type=PredicateType.WHERE,
- column=dimension,
- operator=operator,
- value=value,
- )
+ return {
+ Filter(
+ type=PredicateType.WHERE,
+ column=dimension,
+ operator=operator,
+ value=value,
+ )
+ }
def _get_order_from_query_object(
@@ -693,12 +718,14 @@ def _get_group_limit_filters(
# Add all other non-temporal filters from query_object.filter
for filter_ in query_object.filter:
# Skip temporal range filters - we're using inner bounds instead
- if filter_.get("op") == FilterOperator.TEMPORAL_RANGE.value:
+ if (
+ filter_.get("op") == FilterOperator.TEMPORAL_RANGE.value
+ and query_object.granularity
+ ):
continue
- converted_filter = _convert_query_object_filter(filter_, all_dimensions)
- if converted_filter:
- filters.add(converted_filter)
+ if converted_filters := _convert_query_object_filter(filter_, all_dimensions):
+ filters.update(converted_filters)
return filters if filters else None
diff --git a/superset/semantic_layers/snowflake/semantic_view.py b/superset/semantic_layers/snowflake/semantic_view.py
index 8ce849af2f..654a9e58ef 100644
--- a/superset/semantic_layers/snowflake/semantic_view.py
+++ b/superset/semantic_layers/snowflake/semantic_view.py
@@ -305,7 +305,6 @@ class SnowflakeSemanticView(SemanticViewImplementation):
"""
Execute a query and return the results as a Pandas DataFrame.
"""
- print("AM HERE")
if not metrics and not dimensions:
return DataFrame()
@@ -327,11 +326,7 @@ class SnowflakeSemanticView(SemanticViewImplementation):
**{dimension.id: dimension.name for dimension in dimensions},
**{metric.id: metric.name for metric in metrics},
}
- print("BETO")
- print(df.columns)
- print(mapping)
df.rename(columns=mapping, inplace=True)
- print(df.columns)
return SemanticResult(
requests=[