summaryrefslogtreecommitdiffstats
path: root/contrib/python
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/python')
-rw-r--r--contrib/python/ydb/py3/.dist-info/METADATA2
-rw-r--r--contrib/python/ydb/py3/ya.make2
-rw-r--r--contrib/python/ydb/py3/ydb/aio/query/pool.py28
-rw-r--r--contrib/python/ydb/py3/ydb/aio/query/session.py30
-rw-r--r--contrib/python/ydb/py3/ydb/query/__init__.py2
-rw-r--r--contrib/python/ydb/py3/ydb/query/base.py5
-rw-r--r--contrib/python/ydb/py3/ydb/query/pool.py28
-rw-r--r--contrib/python/ydb/py3/ydb/query/session.py31
-rw-r--r--contrib/python/ydb/py3/ydb/ydb_version.py2
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"