89
89
"TrinoQuery" ,
90
90
"TrinoRequest" ,
91
91
"PROXIES" ,
92
- "SpooledData " ,
92
+ "DecodableSegment " ,
93
93
"SpooledSegment" ,
94
94
"InlineSegment" ,
95
95
"Segment"
@@ -920,16 +920,16 @@ def fetch(self) -> List[Union[List[Any]], Any]:
920
920
if isinstance (status .rows , dict ):
921
921
# spooling protocol
922
922
rows = cast (_SpooledProtocolResponseTO , rows )
923
- segments = self ._to_segments (rows )
923
+ spooled = self ._to_segments (rows )
924
924
if self ._fetch_mode == "segments" :
925
- return segments
926
- return list (SegmentIterator (segments , self ._row_mapper ))
925
+ return spooled
926
+ return list (SegmentIterator (spooled , self ._row_mapper ))
927
927
elif isinstance (status .rows , list ):
928
928
return self ._row_mapper .map (rows )
929
929
else :
930
930
raise ValueError (f"Unexpected type: { type (status .rows )} " )
931
931
932
- def _to_segments (self , rows : _SpooledProtocolResponseTO ) -> SpooledData :
932
+ def _to_segments (self , rows : _SpooledProtocolResponseTO ) -> List [ DecodableSegment ] :
933
933
encoding = rows ["encoding" ]
934
934
metadata = rows ["metadata" ] if "metadata" in rows else None
935
935
segments = []
@@ -944,7 +944,7 @@ def _to_segments(self, rows: _SpooledProtocolResponseTO) -> SpooledData:
944
944
else :
945
945
raise ValueError (f"Unsupported segment type: { segment_type } " )
946
946
947
- return SpooledData ( encoding , metadata , segments )
947
+ return list ( map ( lambda segment : DecodableSegment ( encoding , metadata , segment ), segments ) )
948
948
949
949
def cancel (self ) -> None :
950
950
"""Cancel the current query"""
@@ -1164,46 +1164,44 @@ def __repr__(self):
1164
1164
)
1165
1165
1166
1166
1167
- class SpooledData :
1167
+ class DecodableSegment :
1168
1168
"""
1169
1169
Represents a collection of spooled segments of data, with an encoding format.
1170
1170
1171
1171
Attributes:
1172
1172
encoding (str): The encoding format of the spooled data.
1173
- metadata (_SegmentMetadataTO): Metadata for all segments
1174
- segments (List[ Segment] ): The list of segments in the spooled data.
1173
+ metadata (_SegmentMetadataTO): Metadata for all segments in the query
1174
+ segment ( Segment): The spooled segment data
1175
1175
"""
1176
- def __init__ (self , encoding : str , metadata : _SegmentMetadataTO , segments : List [ Segment ] ) -> None :
1176
+ def __init__ (self , encoding : str , metadata : _SegmentMetadataTO , segment : Segment ) -> None :
1177
1177
self ._encoding = encoding
1178
1178
self ._metadata = metadata
1179
- self ._segments = segments
1180
- self ._segments_iterator = iter (segments )
1179
+ self ._segment = segment
1181
1180
1182
1181
@property
1183
1182
def encoding (self ):
1184
1183
return self ._encoding
1185
1184
1186
1185
@property
1187
- def segments (self ):
1188
- return self ._segments
1189
-
1190
- def __iter__ (self ) -> Iterator [Tuple ["SpooledData" , "Segment" ]]:
1191
- return self
1186
+ def segment (self ):
1187
+ return self ._segment
1192
1188
1193
- def __next__ (self ) -> Tuple ["SpooledData" , "Segment" ]:
1194
- return self , next (self ._segments_iterator )
1189
+ @property
1190
+ def metadata (self ):
1191
+ return self ._metadata
1195
1192
1196
1193
def __repr__ (self ):
1197
- return (f"SpooledData (encoding={ self ._encoding } , metadata={ self ._metadata } , segments= { list ( self ._segments ) } )" )
1194
+ return (f"DecodableSegment (encoding={ self ._encoding } , metadata={ self ._metadata } , segment= { self ._segment } )" )
1198
1195
1199
1196
1200
1197
class SegmentIterator :
1201
- def __init__ (self , spooled_data : SpooledData , mapper : RowMapper ) -> None :
1202
- self ._segments = iter (spooled_data ._segments )
1203
- self ._decoder = SegmentDecoder (CompressedQueryDataDecoderFactory (mapper ).create (spooled_data .encoding ))
1198
+ def __init__ (self , segments : Union [DecodableSegment , List [DecodableSegment ]], mapper : RowMapper ) -> None :
1199
+ self ._segments = iter (segments if isinstance (segments , List ) else [segments ])
1200
+ self ._mapper = mapper
1201
+ self ._decoder = None
1204
1202
self ._rows : Iterator [List [List [Any ]]] = iter ([])
1205
1203
self ._finished = False
1206
- self ._current_segment : Optional [Segment ] = None
1204
+ self ._current_segment : Optional [DecodableSegment ] = None
1207
1205
1208
1206
def __iter__ (self ) -> Iterator [List [Any ]]:
1209
1207
return self
@@ -1214,16 +1212,22 @@ def __next__(self) -> List[Any]:
1214
1212
try :
1215
1213
return next (self ._rows )
1216
1214
except StopIteration :
1217
- if self ._current_segment and isinstance (self ._current_segment , SpooledSegment ):
1218
- self ._current_segment .acknowledge ()
1219
1215
if self ._finished :
1220
1216
raise StopIteration
1221
1217
self ._load_next_segment ()
1222
1218
1223
1219
def _load_next_segment (self ):
1224
1220
try :
1225
- self ._current_segment = segment = next (self ._segments )
1226
- self ._rows = iter (self ._decoder .decode (segment ))
1221
+ if self ._current_segment :
1222
+ segment = self ._current_segment .segment
1223
+ if isinstance (segment , SpooledSegment ):
1224
+ segment .acknowledge ()
1225
+
1226
+ self ._current_segment = next (self ._segments )
1227
+ if self ._decoder is None :
1228
+ self ._decoder = SegmentDecoder (CompressedQueryDataDecoderFactory (self ._mapper )
1229
+ .create (self ._current_segment .encoding ))
1230
+ self ._rows = iter (self ._decoder .decode (self ._current_segment .segment ))
1227
1231
except StopIteration :
1228
1232
self ._finished = True
1229
1233
0 commit comments