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:00 UTC

(superset) branch semantic-layer-implementation updated (e253bd2fb3 -> bfbb68c3c8)

This is an automated email from the ASF dual-hosted git repository.

beto pushed a change to branch semantic-layer-implementation
in repository https://gitbox.apache.org/repos/asf/superset.git


    from e253bd2fb3 Fix mapping
     new b437421a8e Fix filter
     new bfbb68c3c8 WIP

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 superset/semantic_layers/mapper.py                 | 65 +++++++++++++++-------
 .../semantic_layers/snowflake/semantic_view.py     |  7 +--
 2 files changed, 47 insertions(+), 25 deletions(-)


(superset) 02/02: WIP

Posted by be...@apache.org.
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 bfbb68c3c888d1b85585bc205b62527fbae66943
Author: Beto Dealmeida <ro...@dealmeida.net>
AuthorDate: Mon Dec 15 10:26:52 2025 -0500

    WIP
---
 superset/semantic_layers/snowflake/semantic_view.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/superset/semantic_layers/snowflake/semantic_view.py b/superset/semantic_layers/snowflake/semantic_view.py
index 654a9e58ef..4c7ae770e0 100644
--- a/superset/semantic_layers/snowflake/semantic_view.py
+++ b/superset/semantic_layers/snowflake/semantic_view.py
@@ -303,7 +303,7 @@ class SnowflakeSemanticView(SemanticViewImplementation):
         group_limit: GroupLimit | None = None,
     ) -> SemanticResult:
         """
-        Execute a query and return the results as a Pandas DataFrame.
+        Execute a query and return the results as a (wrapped) Pandas DataFrame.
         """
         if not metrics and not dimensions:
             return DataFrame()


(superset) 01/02: Fix filter

Posted by be...@apache.org.
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=[