Skip to content

Commit 47951d8

Browse files
committed
feat(entities): creating effects
1 parent 948802d commit 47951d8

File tree

14 files changed

+353
-228
lines changed

14 files changed

+353
-228
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from abc import ABC, abstractmethod
2+
from collections.abc import Sequence
3+
4+
from tgdb.entities.horizon.effect import (
5+
Claim,
6+
DeletedTuple,
7+
MutatedTuple,
8+
NewTuple,
9+
)
10+
11+
12+
type EncodableEffect = Sequence[NewTuple | MutatedTuple | DeletedTuple | Claim]
13+
14+
15+
class EffectEncoding[EncodedEffectT](ABC):
16+
@abstractmethod
17+
async def decoded(
18+
self, effect: EncodedEffectT, /
19+
) -> EncodableEffect | None: ...

src/tgdb/application/ports/heap.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66

77
class Heap(ABC):
88
@abstractmethod
9-
async def rows(self, schema: str, )
9+
async def tuples_with(self, id: TupleID)
1010

1111
@abstractmethod
1212
async def map(self, effects: Sequence[TransactionEffect], /) -> None: ...
13+
14+
@abstractmethod
15+
async def map_as_dublicates(
16+
self, effects: Sequence[TransactionEffect], /
17+
) -> None: ...

src/tgdb/application/ports/notifying.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
from abc import ABC, abstractmethod
22

3-
from tgdb.entities.horizon.transaction import Commit, ConflictError, NonSerializableWriteTransactionError
3+
from tgdb.entities.horizon.transaction import (
4+
Commit,
5+
ConflictError,
6+
NonSerializableWriteTransactionError,
7+
)
48

59

610
type Publishable = Commit | ConflictError | NonSerializableWriteTransactionError

src/tgdb/application/ports/operator_serialization.py

Lines changed: 0 additions & 10 deletions
This file was deleted.

src/tgdb/entities/horizon/claim.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from dataclasses import dataclass
2+
from uuid import UUID
3+
4+
5+
@dataclass(frozen=True)
6+
class Claim:
7+
id: UUID
8+
object: str

src/tgdb/entities/horizon/effect.py

Lines changed: 0 additions & 77 deletions
This file was deleted.

src/tgdb/entities/horizon/horizon.py

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,7 @@
44
from dataclasses import dataclass
55
from itertools import chain
66

7-
from tgdb.entities.horizon.effect import (
8-
Claim,
9-
DeletedTuple,
10-
MutatedTuple,
11-
NewTuple,
12-
ViewedTuple,
13-
)
7+
from tgdb.entities.horizon.claim import Claim
148
from tgdb.entities.horizon.transaction import (
159
XID,
1610
Commit,
@@ -22,7 +16,13 @@
2216
Transaction,
2317
start_transaction,
2418
)
25-
from tgdb.entities.relation.tuple import Tuple, VersionedTuple
19+
from tgdb.entities.relation.tuple_effect import (
20+
DeletedTuple,
21+
InvalidTuple,
22+
MigratedTuple,
23+
MutatedTuple,
24+
NewTuple,
25+
)
2626
from tgdb.entities.time.logic_time import LogicTime
2727
from tgdb.entities.tools.assert_ import assert_
2828
from tgdb.entities.tools.map import first_map_value
@@ -96,12 +96,12 @@ def start_transaction(
9696

9797
return started_transaction.xid()
9898

99-
def view_tuple(
99+
def include(
100100
self,
101101
time: LogicTime,
102102
xid: XID,
103-
tuple: VersionedTuple,
104-
) -> Tuple:
103+
effect: NewTuple | MigratedTuple | InvalidTuple,
104+
) -> None:
105105
"""
106106
:raises tgdb.entities.horizon.horizon.NotMonotonicTimeError:
107107
:raises tgdb.entities.horizon.horizon.NoTransactionError:
@@ -114,19 +114,11 @@ def view_tuple(
114114
xid, SerializableTransactionState.active
115115
)
116116

117-
if isinstance(transaction, NonSerializableReadTransaction):
118-
transaction.include(ViewedTuple(tuple.latest_version().id))
119-
return tuple.latest_version()
120-
121-
latest_version = tuple.latest_version()
122-
old_versions = tuple.old_versions()
123-
124-
if old_versions:
125-
transaction.include(MutatedTuple(latest_version))
117+
if isinstance(effect, InvalidTuple):
118+
transaction.rollback()
119+
del self._transaction_map(transaction)[transaction.xid()]
126120
else:
127-
transaction.include(ViewedTuple(tuple.latest_version().id))
128-
129-
return latest_version
121+
transaction.include(effect)
130122

131123
def rollback_transaction(self, time: LogicTime, xid: XID) -> None:
132124
"""

src/tgdb/entities/horizon/transaction.py

Lines changed: 27 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,33 @@
1-
from collections.abc import Iterable
1+
from collections.abc import Iterable, Sequence, Set
22
from dataclasses import dataclass
33
from enum import Enum, auto
44
from uuid import UUID
55

6-
from tgdb.entities.horizon.effect import (
7-
Claim,
8-
ConflictableTransactionScalarEffect,
9-
TransactionEffect,
10-
TupleEffect,
6+
from tgdb.entities.horizon.claim import Claim
7+
from tgdb.entities.relation.tuple import TID
8+
from tgdb.entities.relation.tuple_effect import (
9+
DeletedTuple,
10+
MigratedTuple,
11+
MutatedTuple,
12+
NewTuple,
13+
TupleOkEffect,
1114
ViewedTuple,
1215
)
13-
from tgdb.entities.relation.tuple import TupleID
1416
from tgdb.entities.time.logic_time import LogicTime
1517

1618

1719
type XID = UUID
1820

21+
type ConflictableTransactionScalarEffect = TupleOkEffect | Claim
22+
type ConflictableTransactionEffect = Sequence[
23+
ConflictableTransactionScalarEffect
24+
]
25+
26+
type TransactionScalarEffect = (
27+
NewTuple | MutatedTuple | MigratedTuple | DeletedTuple
28+
)
29+
type TransactionEffect = Set[TransactionScalarEffect]
30+
1931

2032
@dataclass(frozen=True)
2133
class ConflictError(Exception):
@@ -52,7 +64,7 @@ class SerializableTransaction:
5264
_xid: XID
5365
_start_time: LogicTime
5466
_state: SerializableTransactionState
55-
_space_map: dict[TupleID, TupleEffect]
67+
_space_map: dict[TID, TupleOkEffect]
5668
_claims: set[Claim]
5769
_concurrent_transactions: set["SerializableTransaction"]
5870
_transactions_with_possible_conflict: set["SerializableTransaction"]
@@ -81,20 +93,20 @@ def state(self) -> SerializableTransactionState:
8193
def claims(self) -> frozenset[Claim]:
8294
return frozenset(self._claims)
8395

84-
def space(self) -> frozenset[TupleID]:
96+
def space(self) -> frozenset[TID]:
8597
return frozenset(self._space_map)
8698

8799
def include(self, effect: ConflictableTransactionScalarEffect) -> None:
88100
if isinstance(effect, Claim):
89101
self._claims.add(effect)
90102
return
91103

92-
prevous_effect = self._space_map.get(effect.id)
104+
prevous_effect = self._space_map.get(effect.tid)
93105

94106
if prevous_effect is not None:
95107
effect = prevous_effect & effect
96108

97-
self._space_map[effect.id] = effect
109+
self._space_map[effect.tid] = effect
98110

99111
def rollback(self) -> None:
100112
state_before_rollback = self._state
@@ -237,7 +249,10 @@ def age(self, time: LogicTime) -> LogicTime:
237249
return time - self._start_time
238250

239251
def include(self, effect: ConflictableTransactionScalarEffect) -> None:
240-
if self._is_readonly and not isinstance(effect, ViewedTuple):
252+
if (
253+
self._is_readonly
254+
and not isinstance(effect, ViewedTuple | MigratedTuple)
255+
):
241256
self._is_readonly = False
242257

243258
def rollback(self) -> None:

0 commit comments

Comments
 (0)