Skip to content

Commit b762e23

Browse files
committed
feat(Horizon): add lazy migration
1 parent 78309d1 commit b762e23

File tree

2 files changed

+52
-5
lines changed

2 files changed

+52
-5
lines changed

src/tgdb/entities/horizon/horizon.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
Transaction,
2323
start_transaction,
2424
)
25+
from tgdb.entities.relation.tuple import Tuple, VersionedTuple
2526
from tgdb.entities.time.logic_time import LogicTime
2627
from tgdb.entities.tools.assert_ import assert_
2728
from tgdb.entities.tools.map import first_map_value
@@ -99,8 +100,8 @@ def view_tuple(
99100
self,
100101
time: LogicTime,
101102
xid: XID,
102-
effect: ViewedTuple,
103-
) -> None:
103+
tuple: VersionedTuple,
104+
) -> Tuple:
104105
"""
105106
:raises tgdb.entities.horizon.horizon.NotMonotonicTimeError:
106107
:raises tgdb.entities.horizon.horizon.NoTransactionError:
@@ -112,7 +113,20 @@ def view_tuple(
112113
transaction = self._transaction(
113114
xid, SerializableTransactionState.active
114115
)
115-
transaction.include(effect)
116+
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))
126+
else:
127+
transaction.include(ViewedTuple(tuple.latest_version().id))
128+
129+
return latest_version
116130

117131
def rollback_transaction(self, time: LogicTime, xid: XID) -> None:
118132
"""

src/tgdb/entities/relation/tuple.py

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
from collections.abc import Iterator
1+
from collections.abc import Iterable, Iterator, Mapping, Sequence
22
from dataclasses import dataclass
33

44
from tgdb.entities.numeration.number import Number
55
from tgdb.entities.relation.scalar import Scalar
6+
from tgdb.entities.tools.assert_ import assert_
67

78

89
@dataclass(frozen=True)
@@ -17,7 +18,39 @@ class Tuple:
1718
scalars: tuple[Scalar, ...]
1819

1920
def __iter__(self) -> Iterator[Scalar]:
20-
return iter(self.scalars)
21+
yield self.id.scalar
22+
yield from iter(self.scalars)
23+
24+
def __len__(self) -> int:
25+
return len(self.scalars) + 1
26+
27+
28+
class HeterogeneousVersionedTupleError(Exception): ...
29+
30+
31+
@dataclass(frozen=True)
32+
class VersionedTuple:
33+
map: Mapping[Number, Tuple]
34+
35+
def latest_version(self) -> Tuple:
36+
return self.map[max(self.map)]
37+
38+
def old_versions(self) -> Sequence[Tuple]:
39+
latest_version_number = max(self.map)
40+
41+
return tuple(
42+
self.map[latest_version_number]
43+
for number in self.map
44+
if number != latest_version_number
45+
)
46+
47+
def __post_init__(self) -> None:
48+
"""
49+
:raises tgdb.entities.relation.tuple.HeterogeneousVersionedTupleError:
50+
"""
51+
52+
id_set = frozenset(version.id for version in self.map.values())
53+
assert_(len(id_set) == 1, else_=HeterogeneousVersionedTupleError)
2154

2255

2356
def tuple_(*scalars: Scalar, relation_id: Number = Number(0)) -> "Tuple": # noqa: B008

0 commit comments

Comments
 (0)