This is an automated email from the ASF dual-hosted git repository. beto pushed a commit to branch explorable in repository https://gitbox.apache.org/repos/asf/superset.git
commit 63a8b0d86ce8bacaded7bf94bb9ef04bcf986b48 Author: Beto Dealmeida <[email protected]> AuthorDate: Tue Oct 7 15:24:09 2025 -0400 Add types --- superset/semantic_layers/snowflake_.py | 2 +- superset/semantic_layers/types.py | 163 +++++++++++++++++++++++++++++++++ 2 files changed, 164 insertions(+), 1 deletion(-) diff --git a/superset/semantic_layers/snowflake_.py b/superset/semantic_layers/snowflake_.py index c0a098e8c1..9d4ed78c04 100644 --- a/superset/semantic_layers/snowflake_.py +++ b/superset/semantic_layers/snowflake_.py @@ -478,7 +478,7 @@ if __name__ == "__main__": "auth": { "auth_type": "user_password", "username": "vavila", - "password": "V!tor1995V!tor1995", + "password": "XXX", }, "allow_changing_database": True, "allow_changing_schema": True, diff --git a/superset/semantic_layers/types.py b/superset/semantic_layers/types.py new file mode 100644 index 0000000000..8ffcb4f1c2 --- /dev/null +++ b/superset/semantic_layers/types.py @@ -0,0 +1,163 @@ +# 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 enum +from dataclasses import dataclass +from datetime import timedelta +from functools import total_ordering + +__all__ = [ + "BINARY", + "BOOLEAN", + "DATE", + "DATETIME", + "DECIMAL", + "DateGrain", + "Dimension", + "INTEGER", + "INTERVAL", + "NUMBER", + "OBJECT", + "STRING", + "TIME", + "TimeGrain", +] + + +class Type: + """ + Base class for types. + """ + + +class INTEGER(Type): + """ + Represents an integer type. + """ + + +class NUMBER(Type): + """ + Represents a number type. + """ + + +class DECIMAL(Type): + """ + Represents a decimal type. + """ + + +class STRING(Type): + """ + Represents a string type. + """ + + +class BOOLEAN(Type): + """ + Represents a boolean type. + """ + + +class DATE(Type): + """ + Represents a date type. + """ + + +class TIME(Type): + """ + Represents a time type. + """ + + +class DATETIME(DATE, TIME): + """ + Represents a datetime type. + """ + + +class INTERVAL(Type): + """ + Represents an interval type. + """ + + +class OBJECT(Type): + """ + Represents an object type. + """ + + +class BINARY(Type): + """ + Represents a binary type. + """ + + +@total_ordering +class ComparableEnum(enum.Enum): + def __eq__(self, other: object) -> bool: + if isinstance(other, enum.Enum): + return self.value == other.value + return NotImplemented + + def __lt__(self, other: object) -> bool: + if isinstance(other, enum.Enum): + return self.value < other.value + return NotImplemented + + def __hash__(self): + return hash((self.__class__, self.name)) + + +class TimeGrain(ComparableEnum): + second = timedelta(seconds=1) + minute = timedelta(minutes=1) + hour = timedelta(hours=1) + + +class DateGrain(ComparableEnum): + day = timedelta(days=1) + week = timedelta(weeks=1) + month = timedelta(days=30) + quarter = timedelta(days=90) + year = timedelta(days=365) + + +@dataclass(frozen=True) +class Dimension: + id: str + name: str + type: type[Type] + + description: str | None = None + definition: str | None = None + grain: DateGrain | TimeGrain | None = None + + +@dataclass(frozen=True) +class Metric: + id: str + name: str + type: type[Type] + + # Metric definitions could be SQL expressions, SQL queries, or even a DSL + definition: str + + description: str | None = None
