dbt/adapters/maxcompute/relation.py (88 lines of code) (raw):
from dataclasses import dataclass, field
from typing import FrozenSet, Optional, TypeVar
from dbt.adapters.base.relation import BaseRelation, InformationSchema
from dbt.adapters.contracts.relation import RelationType, Path, Policy, RelationConfig
from odps.models import Table
from dbt.adapters.maxcompute.relation_configs._materialized_view import (
MaxComputeMaterializedViewConfig,
)
Self = TypeVar("Self", bound="MaxComputeRelation")
@dataclass
class OdpsIncludePolicy(Policy):
database: bool = True
schema: bool = True
identifier: bool = True
@dataclass(frozen=True, eq=False, repr=False)
class MaxComputeRelation(BaseRelation):
quote_character: str = "`"
# subquery alias name is not required in MaxCompute
require_alias: bool = False
def without_quote(self):
return self.quote(False, False, False)
include_policy: Policy = field(default_factory=lambda: OdpsIncludePolicy())
renameable_relations: FrozenSet[RelationType] = field(
default_factory=lambda: frozenset(
{
RelationType.View,
RelationType.Table,
}
)
)
replaceable_relations: FrozenSet[RelationType] = field(
default_factory=lambda: frozenset(
{
RelationType.View,
RelationType.Table,
RelationType.MaterializedView,
}
)
)
@property
def project(self):
return self.database
@property
def is_transactional(self):
return self.get("transactional", False)
def information_schema(
self, identifier: Optional[str] = None
) -> "MaxComputeInformationSchema":
return MaxComputeInformationSchema.from_relation(self, identifier)
@classmethod
def from_odps_table(cls, table: Table):
schema = table.get_schema()
schema = schema.name if schema else "default"
table_type = RelationType.Table
if table.is_virtual_view:
table_type = RelationType.View
if table.is_materialized_view:
table_type = RelationType.MaterializedView
return cls.create(
database=table.project.name,
schema=schema,
identifier=table.name,
type=table_type,
)
@classmethod
def materialized_view_from_relation_config(
cls, relation_config: RelationConfig
) -> MaxComputeMaterializedViewConfig:
return MaxComputeMaterializedViewConfig.from_relation_config(relation_config)
@dataclass(frozen=True, eq=False, repr=False)
class MaxComputeInformationSchema(InformationSchema):
quote_character: str = "`"
@classmethod
def get_path(cls, relation: BaseRelation, information_schema_view: Optional[str]) -> Path:
return Path(
database="SYSTEM_CATALOG",
schema="INFORMATION_SCHEMA",
identifier=information_schema_view,
)
@classmethod
def get_include_policy(cls, relation, information_schema_view):
return relation.include_policy.replace(database=True, schema=True, identifier=True)
@classmethod
def get_quote_policy(
cls,
relation,
information_schema_view: Optional[str],
) -> Policy:
return relation.quote_policy.replace(database=False, schema=False, identifier=False)