diff options
Diffstat (limited to 'contrib/python')
| -rw-r--r-- | contrib/python/ydb/py3/.dist-info/METADATA | 2 | ||||
| -rw-r--r-- | contrib/python/ydb/py3/ya.make | 2 | ||||
| -rw-r--r-- | contrib/python/ydb/py3/ydb/aio/query/pool.py | 28 | ||||
| -rw-r--r-- | contrib/python/ydb/py3/ydb/aio/query/session.py | 30 | ||||
| -rw-r--r-- | contrib/python/ydb/py3/ydb/query/__init__.py | 2 | ||||
| -rw-r--r-- | contrib/python/ydb/py3/ydb/query/base.py | 5 | ||||
| -rw-r--r-- | contrib/python/ydb/py3/ydb/query/pool.py | 28 | ||||
| -rw-r--r-- | contrib/python/ydb/py3/ydb/query/session.py | 31 | ||||
| -rw-r--r-- | contrib/python/ydb/py3/ydb/ydb_version.py | 2 |
9 files changed, 125 insertions, 5 deletions
diff --git a/contrib/python/ydb/py3/.dist-info/METADATA b/contrib/python/ydb/py3/.dist-info/METADATA index d754214e8f6..1158c004283 100644 --- a/contrib/python/ydb/py3/.dist-info/METADATA +++ b/contrib/python/ydb/py3/.dist-info/METADATA @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: ydb -Version: 3.21.8 +Version: 3.21.9 Summary: YDB Python SDK Home-page: http://github.com/ydb-platform/ydb-python-sdk Author: Yandex LLC diff --git a/contrib/python/ydb/py3/ya.make b/contrib/python/ydb/py3/ya.make index 8958d7b97e4..634ea53ac19 100644 --- a/contrib/python/ydb/py3/ya.make +++ b/contrib/python/ydb/py3/ya.make @@ -2,7 +2,7 @@ PY3_LIBRARY() -VERSION(3.21.8) +VERSION(3.21.9) LICENSE(Apache-2.0) diff --git a/contrib/python/ydb/py3/ydb/aio/query/pool.py b/contrib/python/ydb/py3/ydb/aio/query/pool.py index b691a1b111c..a7fdd3b0005 100644 --- a/contrib/python/ydb/py3/ydb/aio/query/pool.py +++ b/contrib/python/ydb/py3/ydb/aio/query/pool.py @@ -4,6 +4,9 @@ from typing import ( Callable, Optional, List, + Dict, + Any, + Union, ) from .session import ( @@ -13,7 +16,7 @@ from ...retries import ( RetrySettings, retry_operation_async, ) -from ...query.base import BaseQueryTxMode +from ...query.base import BaseQueryTxMode, QueryExplainResultFormat from ...query.base import QueryClientSettings from ... import convert from ..._grpc.grpcwrapper import common_utils @@ -194,6 +197,29 @@ class QuerySessionPool: return await retry_operation_async(wrapped_callee, retry_settings) + async def explain_with_retries( + self, + query: str, + parameters: Optional[dict] = None, + *, + result_format: QueryExplainResultFormat = QueryExplainResultFormat.STR, + retry_settings: Optional[RetrySettings] = None, + ) -> Union[str, Dict[str, Any]]: + """ + Explain a query in retriable way. No real query execution will happen. + + :param query: A query, yql or sql text. + :param parameters: dict with parameters and YDB types; + :param result_format: Return format: string or dict. + :param retry_settings: RetrySettings object. + :return: Parsed query plan. + """ + + async def callee(session: QuerySession): + return await session.explain(query, parameters, result_format=result_format) + + return await self.retry_operation_async(callee, retry_settings) + async def stop(self): self._should_stop.set() diff --git a/contrib/python/ydb/py3/ydb/aio/query/session.py b/contrib/python/ydb/py3/ydb/aio/query/session.py index 83d527b7438..13906164d60 100644 --- a/contrib/python/ydb/py3/ydb/aio/query/session.py +++ b/contrib/python/ydb/py3/ydb/aio/query/session.py @@ -1,7 +1,11 @@ import asyncio +import json from typing import ( Optional, + Dict, + Any, + Union, ) from .base import AsyncResponseContextIterator @@ -162,3 +166,29 @@ class QuerySession(BaseQuerySession): ), error_converter=stream_error_converter, ) + + async def explain( + self, + query: str, + parameters: Optional[dict] = None, + result_format: base.QueryExplainResultFormat = base.QueryExplainResultFormat.STR, + ) -> Union[str, Dict[str, Any]]: + """Explains query result + :param query: YQL or SQL query. + :param parameters: dict with parameters and YDB types; + :param result_format: Return format: string or dict. + :return: Parsed query plan. + """ + + res = await self.execute(query, parameters, exec_mode=base.QueryExecMode.EXPLAIN) + + # it needs to read result sets for set last_query_stats as sideeffect + async for _ in res: + pass + + plan = self.last_query_stats.query_plan + + if result_format == base.QueryExplainResultFormat.DICT: + plan = json.loads(plan) + + return plan diff --git a/contrib/python/ydb/py3/ydb/query/__init__.py b/contrib/python/ydb/py3/ydb/query/__init__.py index 76436f98353..56e87524494 100644 --- a/contrib/python/ydb/py3/ydb/query/__init__.py +++ b/contrib/python/ydb/py3/ydb/query/__init__.py @@ -1,5 +1,6 @@ __all__ = [ "BaseQueryTxMode", + "QueryExplainResultFormat", "QueryOnlineReadOnly", "QuerySerializableReadWrite", "QuerySnapshotReadOnly", @@ -15,6 +16,7 @@ import logging from .base import ( QueryClientSettings, + QueryExplainResultFormat, QueryStatsMode, ) diff --git a/contrib/python/ydb/py3/ydb/query/base.py b/contrib/python/ydb/py3/ydb/query/base.py index 4007e72dddc..d69aa81db08 100644 --- a/contrib/python/ydb/py3/ydb/query/base.py +++ b/contrib/python/ydb/py3/ydb/query/base.py @@ -42,6 +42,11 @@ class QueryExecMode(enum.IntEnum): EXECUTE = 50 +class QueryExplainResultFormat(enum.Enum): + STR = 0 + DICT = 10 + + class QueryStatsMode(enum.IntEnum): UNSPECIFIED = 0 NONE = 10 diff --git a/contrib/python/ydb/py3/ydb/query/pool.py b/contrib/python/ydb/py3/ydb/query/pool.py index fc05950c9d6..dd2ac0214d9 100644 --- a/contrib/python/ydb/py3/ydb/query/pool.py +++ b/contrib/python/ydb/py3/ydb/query/pool.py @@ -4,12 +4,15 @@ from typing import ( Callable, Optional, List, + Dict, + Any, + Union, ) import time import threading import queue -from .base import BaseQueryTxMode +from .base import BaseQueryTxMode, QueryExplainResultFormat from .base import QueryClientSettings from .session import ( QuerySession, @@ -270,6 +273,29 @@ class QuerySessionPool: **kwargs, ) + def explain_with_retries( + self, + query: str, + parameters: Optional[dict] = None, + *, + result_format: QueryExplainResultFormat = QueryExplainResultFormat.STR, + retry_settings: Optional[RetrySettings] = None, + ) -> Union[str, Dict[str, Any]]: + """ + Explain a query in retriable way. No real query execution will happen. + + :param query: A query, yql or sql text. + :param parameters: dict with parameters and YDB types; + :param result_format: Return format: string or dict. + :param retry_settings: RetrySettings object. + :return: Parsed query plan. + """ + + def callee(session: QuerySession): + return session.explain(query, parameters, result_format=result_format) + + return self.retry_operation_sync(callee, retry_settings) + def stop(self, timeout=None): acquire_timeout = timeout if timeout is not None else -1 acquired = self._lock.acquire(timeout=acquire_timeout) diff --git a/contrib/python/ydb/py3/ydb/query/session.py b/contrib/python/ydb/py3/ydb/query/session.py index 5cfbdc6ceba..48fa6463b32 100644 --- a/contrib/python/ydb/py3/ydb/query/session.py +++ b/contrib/python/ydb/py3/ydb/query/session.py @@ -1,13 +1,18 @@ import abc import enum +import json import logging import threading from typing import ( Iterable, Optional, + Dict, + Any, + Union, ) from . import base +from .base import QueryExplainResultFormat from .. import _apis, issues, _utilities from ..settings import BaseRequestSettings @@ -371,3 +376,29 @@ class QuerySession(BaseQuerySession): settings=self._settings, ), ) + + def explain( + self, + query: str, + parameters: dict = None, + *, + result_format: QueryExplainResultFormat = QueryExplainResultFormat.STR, + ) -> Union[str, Dict[str, Any]]: + """Explains query result + :param query: YQL or SQL query. + :param parameters: dict with parameters and YDB types; + :param result_format: Return format: string or dict. + :return: Parsed query plan. + """ + + res = self.execute(query, parameters, exec_mode=base.QueryExecMode.EXPLAIN) + + # is needs to read result sets for set last_query_stats as sideeffect + for _ in res: + pass + + plan = self.last_query_stats.query_plan + if result_format == QueryExplainResultFormat.DICT: + plan = json.loads(plan) + + return plan diff --git a/contrib/python/ydb/py3/ydb/ydb_version.py b/contrib/python/ydb/py3/ydb/ydb_version.py index 68d3e8ca2bc..70f9f0a38ed 100644 --- a/contrib/python/ydb/py3/ydb/ydb_version.py +++ b/contrib/python/ydb/py3/ydb/ydb_version.py @@ -1 +1 @@ -VERSION = "3.21.8" +VERSION = "3.21.9" |
