1+ from datetime import datetime , timedelta , timezone
12from enum import Enum
3+ from uuid import UUID
24
35from tgdb .entities .numeration .number import Number
6+ from tgdb .entities .relation .domain import (
7+ BoolDomain ,
8+ DatetimeDomain ,
9+ Domain ,
10+ IntDomain ,
11+ StrDomain ,
12+ UuidDomain ,
13+ )
414from tgdb .entities .relation .relation import RelationSchemaID
515from tgdb .entities .relation .scalar import Scalar
16+ from tgdb .entities .relation .schema import Schema
617from tgdb .entities .relation .tuple import TID , Tuple
718from tgdb .infrastructure .primitive_encoding import (
819 ReversibleTranslationTable ,
1122 decoded_uuid ,
1223 encoded_int ,
1324 encoded_primitive_with_type ,
25+ encoded_primitive_without_type ,
1426 encoded_uuid ,
1527)
1628
@@ -27,6 +39,16 @@ class Separator(Enum):
2739
2840
2941class HeapTupleEncoding :
42+ @staticmethod
43+ def largest_tuple (
44+ schema : Schema ,
45+ schema_id : RelationSchemaID ,
46+ ) -> Tuple :
47+ xid , schema_id = _HeapTupleMetadataEncoding .largest_metadata (schema_id )
48+ scalars = map (_HeapTupleAttributeEncoding .largest_scalar , schema )
49+
50+ return Tuple (xid , schema_id , tuple (scalars ))
51+
3052 @staticmethod
3153 def encoded_tuple (tuple_ : Tuple ) -> str :
3254 encoded_metadata = _HeapTupleMetadataEncoding .encoded_metadata (
@@ -111,6 +133,10 @@ def decoded_metadata(encoded_metadata: str) -> _HeapTupleMetadata:
111133 def id_of_encoded_tuple_with_tid (tid : TID ) -> str :
112134 return f"{ Separator .top_metadata .value } { encoded_uuid (tid )} "
113135
136+ @staticmethod
137+ def largest_metadata (schema_id : RelationSchemaID ) -> _HeapTupleMetadata :
138+ return UUID (int = 0 ), schema_id
139+
114140
115141class _HeapTupleAttributeEncoding :
116142 @staticmethod
@@ -132,3 +158,25 @@ def decoded_scalar(encoded_attribute: str) -> Scalar:
132158 )
133159
134160 return decoded_primitive_with_type (encoded_scalar , heap_tuple_table )
161+
162+ @staticmethod
163+ def largest_scalar (domain : Domain ) -> Scalar :
164+ match domain :
165+ case IntDomain ():
166+ return max (domain .min , domain .max , key = lambda it : len (str (it )))
167+ case StrDomain ():
168+ return "x" * domain .max_len
169+ case BoolDomain ():
170+ return True
171+ case DatetimeDomain ():
172+ tzinfo = timezone (timedelta (hours = 14 ))
173+ return datetime (9999 , 12 , 31 , 23 , 59 , 59 , 999999 , tzinfo = tzinfo )
174+ case UuidDomain ():
175+ return UUID (int = 0 )
176+ case tuple ():
177+ return max (
178+ domain ,
179+ key = lambda it : (
180+ encoded_primitive_without_type (it , heap_tuple_table )
181+ )
182+ )
0 commit comments