mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-09-05 15:13:07 +00:00
* fix: handle oracle unique count * fix: failing test case
This commit is contained in:
parent
a7e2f33adc
commit
2e8e79ff0a
@ -15,9 +15,10 @@ Validator for column values to be unique test case
|
|||||||
|
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from sqlalchemy import Column, inspect
|
from sqlalchemy import Column, inspect, literal_column
|
||||||
from sqlalchemy.exc import SQLAlchemyError
|
from sqlalchemy.exc import SQLAlchemyError
|
||||||
|
|
||||||
|
from ingestion.src.metadata.profiler.orm.registry import Dialects
|
||||||
from metadata.data_quality.validations.column.base.columnValuesToBeUnique import (
|
from metadata.data_quality.validations.column.base.columnValuesToBeUnique import (
|
||||||
BaseColumnValuesToBeUniqueValidator,
|
BaseColumnValuesToBeUniqueValidator,
|
||||||
)
|
)
|
||||||
@ -57,7 +58,18 @@ class ColumnValuesToBeUniqueValidator(
|
|||||||
) # type: ignore
|
) # type: ignore
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.value = dict(self.runner.dispatch_query_select_first(count, unique_count.scalar_subquery().label("uniqueCount"))) # type: ignore
|
if self.runner.dialect == Dialects.Oracle:
|
||||||
|
query_group_by_ = [literal_column("2")]
|
||||||
|
else:
|
||||||
|
query_group_by_ = None
|
||||||
|
|
||||||
|
self.value = dict(
|
||||||
|
self.runner.dispatch_query_select_first(
|
||||||
|
count,
|
||||||
|
unique_count.scalar_subquery().label("uniqueCount"),
|
||||||
|
query_group_by_=query_group_by_,
|
||||||
|
)
|
||||||
|
) # type: ignore
|
||||||
res = self.value.get(Metrics.COUNT.name)
|
res = self.value.get(Metrics.COUNT.name)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
raise SQLAlchemyError(exc)
|
raise SQLAlchemyError(exc)
|
||||||
|
@ -23,7 +23,10 @@ from sqlalchemy.orm import DeclarativeMeta, Query, Session
|
|||||||
from sqlalchemy.orm.util import AliasedClass
|
from sqlalchemy.orm.util import AliasedClass
|
||||||
|
|
||||||
from metadata.utils.logger import query_runner_logger
|
from metadata.utils.logger import query_runner_logger
|
||||||
from metadata.utils.sqa_utils import get_query_filter_for_runner
|
from metadata.utils.sqa_utils import (
|
||||||
|
get_query_filter_for_runner,
|
||||||
|
get_query_group_by_for_runner,
|
||||||
|
)
|
||||||
|
|
||||||
logger = query_runner_logger()
|
logger = query_runner_logger()
|
||||||
|
|
||||||
@ -88,6 +91,11 @@ class QueryRunner:
|
|||||||
"""Table name attribute access"""
|
"""Table name attribute access"""
|
||||||
return self._session
|
return self._session
|
||||||
|
|
||||||
|
@property
|
||||||
|
def dialect(self) -> str:
|
||||||
|
"""Dialect attribute access"""
|
||||||
|
return self._session.get_bind().dialect.name
|
||||||
|
|
||||||
def _build_query(self, *entities, **kwargs) -> Query:
|
def _build_query(self, *entities, **kwargs) -> Query:
|
||||||
"""Build query object
|
"""Build query object
|
||||||
|
|
||||||
@ -106,11 +114,15 @@ class QueryRunner:
|
|||||||
**kwargs: kwargs to pass to the query
|
**kwargs: kwargs to pass to the query
|
||||||
"""
|
"""
|
||||||
filter_ = get_query_filter_for_runner(kwargs)
|
filter_ = get_query_filter_for_runner(kwargs)
|
||||||
|
group_by_ = get_query_group_by_for_runner(kwargs)
|
||||||
|
|
||||||
query = self._build_query(*entities, **kwargs).select_from(self._dataset)
|
query = self._build_query(*entities, **kwargs).select_from(self._dataset)
|
||||||
|
|
||||||
if filter_ is not None:
|
if filter_ is not None:
|
||||||
return query.filter(filter_)
|
query = query.filter(filter_)
|
||||||
|
|
||||||
|
if group_by_ is not None:
|
||||||
|
query = query.group_by(*group_by_)
|
||||||
|
|
||||||
return query
|
return query
|
||||||
|
|
||||||
@ -122,7 +134,7 @@ class QueryRunner:
|
|||||||
**kwargs: kwargs to pass to the query
|
**kwargs: kwargs to pass to the query
|
||||||
"""
|
"""
|
||||||
filter_ = get_query_filter_for_runner(kwargs)
|
filter_ = get_query_filter_for_runner(kwargs)
|
||||||
|
group_by_ = get_query_group_by_for_runner(kwargs)
|
||||||
user_query = self._session.query(self._dataset).from_statement(
|
user_query = self._session.query(self._dataset).from_statement(
|
||||||
text(f"{self.profile_sample_query}")
|
text(f"{self.profile_sample_query}")
|
||||||
)
|
)
|
||||||
@ -130,7 +142,10 @@ class QueryRunner:
|
|||||||
query = self._build_query(*entities, **kwargs).select_from(user_query)
|
query = self._build_query(*entities, **kwargs).select_from(user_query)
|
||||||
|
|
||||||
if filter_ is not None:
|
if filter_ is not None:
|
||||||
return query.filter(filter_)
|
query = query.filter(filter_)
|
||||||
|
|
||||||
|
if group_by_ is not None:
|
||||||
|
query = query.group_by(*group_by_)
|
||||||
|
|
||||||
return query
|
return query
|
||||||
|
|
||||||
@ -143,13 +158,17 @@ class QueryRunner:
|
|||||||
**kwargs: kwargs to pass to the query
|
**kwargs: kwargs to pass to the query
|
||||||
"""
|
"""
|
||||||
filter_ = get_query_filter_for_runner(kwargs)
|
filter_ = get_query_filter_for_runner(kwargs)
|
||||||
|
group_by_ = get_query_group_by_for_runner(kwargs)
|
||||||
|
|
||||||
if self.profile_sample_query:
|
if self.profile_sample_query:
|
||||||
return self._select_from_user_query(*entities, **kwargs).first()
|
return self._select_from_user_query(*entities, **kwargs).first()
|
||||||
query = self._build_query(*entities, **kwargs).select_from(self.table)
|
query = self._build_query(*entities, **kwargs).select_from(self.table)
|
||||||
|
|
||||||
if filter_ is not None:
|
if filter_ is not None:
|
||||||
return query.filter(filter_).first()
|
query = query.filter(filter_)
|
||||||
|
|
||||||
|
if group_by_ is not None:
|
||||||
|
query = query.group_by(*group_by_)
|
||||||
|
|
||||||
return query.first()
|
return query.first()
|
||||||
|
|
||||||
@ -162,6 +181,7 @@ class QueryRunner:
|
|||||||
**kwargs: kwargs to pass to the query
|
**kwargs: kwargs to pass to the query
|
||||||
"""
|
"""
|
||||||
filter_ = get_query_filter_for_runner(kwargs)
|
filter_ = get_query_filter_for_runner(kwargs)
|
||||||
|
group_by_ = get_query_group_by_for_runner(kwargs)
|
||||||
|
|
||||||
if self.profile_sample_query:
|
if self.profile_sample_query:
|
||||||
return self._select_from_user_query(*entities, **kwargs).all()
|
return self._select_from_user_query(*entities, **kwargs).all()
|
||||||
@ -169,7 +189,10 @@ class QueryRunner:
|
|||||||
query = self._build_query(*entities, **kwargs).select_from(self.table)
|
query = self._build_query(*entities, **kwargs).select_from(self.table)
|
||||||
|
|
||||||
if filter_ is not None:
|
if filter_ is not None:
|
||||||
return query.filter(filter_).all()
|
query = query.filter(filter_)
|
||||||
|
|
||||||
|
if group_by_ is not None:
|
||||||
|
query = query.group_by(*group_by_)
|
||||||
|
|
||||||
return query.all()
|
return query.all()
|
||||||
|
|
||||||
|
@ -191,6 +191,21 @@ def get_query_filter_for_runner(kwargs: Dict) -> Optional[BinaryExpression]:
|
|||||||
return filter_
|
return filter_
|
||||||
|
|
||||||
|
|
||||||
|
def get_query_group_by_for_runner(kwargs: Dict) -> Optional[BinaryExpression]:
|
||||||
|
"""Get query group by from kwargs. IMPORTANT, this will update the original dictionary
|
||||||
|
passed in the function argument.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
kwargs (Dict): kwargs
|
||||||
|
"""
|
||||||
|
if "query_group_by_" in kwargs:
|
||||||
|
group_by_ = kwargs.pop("query_group_by_")
|
||||||
|
else:
|
||||||
|
group_by_ = None
|
||||||
|
|
||||||
|
return group_by_
|
||||||
|
|
||||||
|
|
||||||
def handle_array(
|
def handle_array(
|
||||||
query: Query, column: Column, table: Union[DeclarativeMeta, AliasedClass]
|
query: Query, column: Column, table: Union[DeclarativeMeta, AliasedClass]
|
||||||
) -> Query:
|
) -> Query:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user