@@ -238,6 +238,12 @@ def add_collector(self, name: str | None = None) -> DataCollector:
238238 )
239239 )
240240
241+ class GeneratedField (Enum ):
242+ """
243+ A generated field is automatically set by the engine.
244+ """
245+ UUID = "Uuid"
246+
241247class DataCollector :
242248 """A data collector is used to collect data into a collector."""
243249 _flow_builder_state : _FlowBuilderState
@@ -248,12 +254,25 @@ def __init__(self, flow_builder_state: _FlowBuilderState,
248254 self ._flow_builder_state = flow_builder_state
249255 self ._engine_data_collector = data_collector
250256
251- def collect (self , ** kwargs : DataSlice ):
257+ def collect (self , ** kwargs : DataSlice | GeneratedField ):
252258 """
253259 Collect data into the collector.
254260 """
261+ regular_kwargs = []
262+ auto_uuid_field = None
263+ for k , v in kwargs .items ():
264+ if isinstance (v , GeneratedField ):
265+ if v == GeneratedField .UUID :
266+ if auto_uuid_field is not None :
267+ raise ValueError ("Only one generated UUID field is allowed" )
268+ auto_uuid_field = k
269+ else :
270+ raise ValueError (f"Unexpected generated field: { v } " )
271+ else :
272+ regular_kwargs .append ((k , _data_slice_state (v ).engine_data_slice ))
273+
255274 self ._flow_builder_state .engine_flow_builder .collect (
256- self ._engine_data_collector , [( k , _data_slice_state ( v ). engine_data_slice ) for k , v in kwargs . items ()] )
275+ self ._engine_data_collector , regular_kwargs , auto_uuid_field )
257276
258277 def export (self , name : str , target_spec : op .StorageSpec , / , * ,
259278 primary_key_fields : Sequence [str ] | None = None ,
0 commit comments