@@ -1925,15 +1925,38 @@ def add_new_deferred_fragments(
1925
1925
defer_map : RefMap [DeferUsage , DeferredFragmentRecord ] | None = None ,
1926
1926
path : Path | None = None ,
1927
1927
) -> RefMap [DeferUsage , DeferredFragmentRecord ]:
1928
- """Add new deferred fragments to the defer map."""
1928
+ """Add new deferred fragments to the defer map.
1929
+
1930
+ Instantiates new DeferredFragmentRecords for the given path within an
1931
+ incremental data record, returning an updated map of DeferUsage
1932
+ objects to DeferredFragmentRecords.
1933
+
1934
+ Note: As defer directives may be used with operations returning lists,
1935
+ a DeferUsage object may correspond to many DeferredFragmentRecords.
1936
+
1937
+ DeferredFragmentRecord creation includes the following steps:
1938
+ 1. The new DeferredFragmentRecord is instantiated at the given path.
1939
+ 2. The parent result record is calculated from the given incremental data record.
1940
+ 3. The IncrementalPublisher is notified that a new DeferredFragmentRecord
1941
+ with the calculated parent has been added; the record will be released only
1942
+ after the parent has completed.
1943
+ """
1929
1944
new_defer_map : RefMap [DeferUsage , DeferredFragmentRecord ]
1930
1945
if not new_defer_usages :
1946
+ # Given no DeferUsages, return the existing map, creating one if necessary.
1931
1947
return RefMap () if defer_map is None else defer_map
1932
1948
new_defer_map = RefMap () if defer_map is None else RefMap (defer_map .items ())
1949
+ # For each new DeferUsage object:
1933
1950
for defer_usage in new_defer_usages :
1934
1951
ancestors = defer_usage .ancestors
1935
1952
parent_defer_usage = ancestors [0 ] if ancestors else None
1936
1953
1954
+ # If the parent target is defined, the parent target is a DeferUsage object
1955
+ # and the parent result record is the DeferredFragmentRecord corresponding
1956
+ # to that DeferUsage.
1957
+ # If the parent target is not defined, the parent result record is either:
1958
+ # - the InitialResultRecord, or
1959
+ # - a StreamItemsRecord, as `@defer` may be nested under `@stream`.
1937
1960
parent = (
1938
1961
cast (Union [InitialResultRecord , StreamItemsRecord ], incremental_data_record )
1939
1962
if parent_defer_usage is None
@@ -1942,12 +1965,15 @@ def add_new_deferred_fragments(
1942
1965
)
1943
1966
)
1944
1967
1968
+ # Instantiate the new record.
1945
1969
deferred_fragment_record = DeferredFragmentRecord (path , defer_usage .label )
1946
1970
1971
+ # Report the new record to the Incremental Publisher.
1947
1972
incremental_publisher .report_new_defer_fragment_record (
1948
1973
deferred_fragment_record , parent
1949
1974
)
1950
1975
1976
+ # Update the map.
1951
1977
new_defer_map [defer_usage ] = deferred_fragment_record
1952
1978
1953
1979
return new_defer_map
0 commit comments