Skip to content

Commit 75ea82d

Browse files
committed
refactor session
1 parent 2ce3d6e commit 75ea82d

File tree

4 files changed

+209
-88
lines changed

4 files changed

+209
-88
lines changed

tests/query/conftest.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import pytest
2+
from ydb.query.session import QuerySessionSync
3+
4+
5+
@pytest.fixture
6+
def session(driver_sync):
7+
session = QuerySessionSync(driver_sync)
8+
9+
yield session
10+
11+
try:
12+
session.delete()
13+
except BaseException:
14+
pass
15+
16+
@pytest.fixture
17+
def transaction(session):
18+
session.create()
19+
transaction = session.transaction()
20+
21+
yield transaction
22+
23+
try:
24+
transaction.rollback()
25+
except BaseException:
26+
pass
27+

tests/query/test_query_session.py

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import pytest
22

3-
import ydb.query.session
4-
53
def _check_session_state_empty(session):
64
assert session._state.session_id == None
75
assert session._state.node_id == None
@@ -13,8 +11,7 @@ def _check_session_state_full(session):
1311
assert session._state.attached == True
1412

1513
class TestQuerySession:
16-
def test_session_normal_lifecycle(self, driver_sync):
17-
session = ydb.query.session.QuerySessionSync(driver_sync)
14+
def test_session_normal_lifecycle(self, session):
1815
_check_session_state_empty(session)
1916

2017
session.create()
@@ -23,8 +20,7 @@ def test_session_normal_lifecycle(self, driver_sync):
2320
session.delete()
2421
_check_session_state_empty(session)
2522

26-
def test_second_create_do_nothing(self, driver_sync):
27-
session = ydb.query.session.QuerySessionSync(driver_sync)
23+
def test_second_create_do_nothing(self, session):
2824
session.create()
2925
_check_session_state_full(session)
3026

@@ -36,3 +32,55 @@ def test_second_create_do_nothing(self, driver_sync):
3632

3733
assert session._state.session_id == session_id_before
3834
assert session._state.node_id == node_id_before
35+
36+
def test_second_delete_do_nothing(self, session):
37+
session.create()
38+
39+
session.delete()
40+
session.delete()
41+
42+
def test_delete_before_create_not_possible(self, session):
43+
with pytest.raises(RuntimeError):
44+
session.delete()
45+
46+
def test_create_after_delete_not_possible(self, session):
47+
session.create()
48+
session.delete()
49+
with pytest.raises(RuntimeError):
50+
session.create()
51+
52+
def test_transaction_before_create_raises(self, session):
53+
with pytest.raises(RuntimeError):
54+
session.transaction()
55+
56+
def test_transaction_after_delete_raises(self, session):
57+
session.create()
58+
59+
session.delete()
60+
61+
with pytest.raises(RuntimeError):
62+
session.transaction()
63+
64+
def test_transaction_after_create_not_raises(self, session):
65+
session.create()
66+
session.transaction()
67+
68+
def test_execute_before_create_raises(self, session):
69+
with pytest.raises(RuntimeError):
70+
session.execute("select 1;")
71+
72+
def test_execute_after_delete_raises(self, session):
73+
session.create()
74+
session.delete()
75+
with pytest.raises(RuntimeError):
76+
session.execute("select 1;")
77+
78+
def test_basic_execute(self, session):
79+
session.create()
80+
it = session.execute("select 1;")
81+
result_sets = [result_set for result_set in it]
82+
83+
assert len(result_sets) == 1
84+
assert len(result_sets[0].rows) == 1
85+
assert len(result_sets[0].columns) == 1
86+
assert list(result_sets[0].rows[0].values()) == [1]

ydb/query/base.py

Lines changed: 22 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -20,83 +20,40 @@
2020
class QueryClientSettings: ...
2121

2222

23-
class QuerySessionStateEnum(enum.Enum):
24-
NOT_INITIALIZED = "NOT_INITIALIZED"
25-
CREATED = "CREATED"
26-
CLOSED = "CLOSED"
27-
28-
29-
class QuerySessionStateHelper(abc.ABC):
30-
_VALID_TRANSITIONS = {
31-
QuerySessionStateEnum.NOT_INITIALIZED: [QuerySessionStateEnum.CREATED],
32-
QuerySessionStateEnum.CREATED: [QuerySessionStateEnum.CLOSED],
33-
QuerySessionStateEnum.CLOSED: []
34-
}
35-
36-
@classmethod
37-
def valid_transition(cls, before: QuerySessionStateEnum, after: QuerySessionStateEnum) -> bool:
38-
return after in cls._VALID_TRANSITIONS[before]
39-
40-
41-
class QueryTxStateEnum(enum.Enum):
42-
NOT_INITIALIZED = "NOT_INITIALIZED"
43-
BEGINED = "BEGINED"
44-
COMMITTED = "COMMITTED"
45-
ROLLBACKED = "ROLLBACKED"
46-
DEAD = "DEAD"
47-
48-
49-
class QueryTxStateHelper(abc.ABC):
50-
_VALID_TRANSITIONS = {
51-
QueryTxStateEnum.NOT_INITIALIZED: [QueryTxStateEnum.BEGINED, QueryTxStateEnum.DEAD],
52-
QueryTxStateEnum.BEGINED: [QueryTxStateEnum.COMMITTED, QueryTxStateEnum.ROLLBACKED, QueryTxStateEnum.DEAD],
53-
QueryTxStateEnum.COMMITTED: [],
54-
QueryTxStateEnum.ROLLBACKED: [],
55-
QueryTxStateEnum.DEAD: [],
56-
}
57-
58-
@classmethod
59-
def valid_transition(cls, before: QueryTxStateEnum, after: QueryTxStateEnum) -> bool:
60-
return after in cls._VALID_TRANSITIONS[before]
61-
62-
63-
class QuerySessionState:
64-
_session_id: Optional[str]
65-
_node_id: Optional[int]
66-
_attached: bool = False
67-
_settings: Optional[QueryClientSettings]
68-
23+
class IQuerySessionState(abc.ABC):
6924
def __init__(self, settings: QueryClientSettings = None):
70-
self._settings = settings
71-
self.reset()
25+
pass
7226

27+
@abc.abstractmethod
7328
def reset(self) -> None:
74-
self._session_id = None
75-
self._node_id = None
76-
self._attached = False
29+
pass
7730

7831
@property
32+
@abc.abstractmethod
7933
def session_id(self) -> Optional[str]:
80-
return self._session_id
34+
pass
8135

82-
def set_session_id(self, session_id: str) -> "QuerySessionState":
83-
self._session_id = session_id
84-
return self
36+
@abc.abstractmethod
37+
def set_session_id(self, session_id: str) -> "IQuerySessionState":
38+
pass
8539

8640
@property
41+
@abc.abstractmethod
8742
def node_id(self) -> Optional[int]:
88-
return self._node_id
43+
pass
8944

90-
def set_node_id(self, node_id: int) -> "QuerySessionState":
91-
self._node_id = node_id
92-
return self
45+
@abc.abstractmethod
46+
def set_node_id(self, node_id: int) -> "IQuerySessionState":
47+
pass
9348

9449
@property
50+
@abc.abstractmethod
9551
def attached(self) -> bool:
96-
return self._attached
52+
pass
9753

98-
def set_attached(self, attached: bool) -> None:
99-
self._attached = attached
54+
@abc.abstractmethod
55+
def set_attached(self, attached: bool) -> "IQuerySessionState":
56+
pass
10057

10158

10259
class IQuerySession(abc.ABC):
@@ -120,7 +77,7 @@ def transaction(self, tx_mode: BaseQueryTxMode) -> "IQueryTxContext":
12077
class IQueryTxContext(abc.ABC):
12178

12279
@abc.abstractmethod
123-
def __init__(self, driver: SupportedDriverType, session_state: QuerySessionState, session: IQuerySession, tx_mode: BaseQueryTxMode = None):
80+
def __init__(self, driver: SupportedDriverType, session_state: IQuerySessionState, session: IQuerySession, tx_mode: BaseQueryTxMode = None):
12481
pass
12582

12683
@abc.abstractmethod
@@ -184,17 +141,17 @@ def create_execute_query_request(query: str, session_id: str, commit_tx: bool):
184141
return req.to_proto()
185142

186143
def wrap_execute_query_response(rpc_state, response_pb):
187-
188144
return convert.ResultSet.from_message(response_pb.result_set)
189145

146+
190147
X_YDB_SERVER_HINTS = "x-ydb-server-hints"
191148
X_YDB_SESSION_CLOSE = "session-close"
192149

193150

194151
def _check_session_is_closing(rpc_state, session_state):
195152
metadata = rpc_state.trailing_metadata()
196153
if X_YDB_SESSION_CLOSE in metadata.get(X_YDB_SERVER_HINTS, []):
197-
session_state.set_closing()
154+
session_state.set_closing() # TODO: clarify & implement
198155

199156

200157
def bad_session_handler(func):

0 commit comments

Comments
 (0)