@@ -65,6 +65,50 @@ TumbleAggregatingTransformWithSubstream::getFinalizedWindowsWithBuckets(Int64 wa
65
65
{time_bucket}});
66
66
}
67
67
68
+ if (params->fill_missing_window && substream_ctx->finalized_watermark != INVALID_WATERMARK)
69
+ {
70
+ auto finalized_window_start = toStartTime (
71
+ substream_ctx->finalized_watermark ,
72
+ window_params.interval_kind ,
73
+ window_params.window_interval ,
74
+ *window_params.time_zone ,
75
+ window_params.time_scale );
76
+
77
+ auto next_window_end = addTime (
78
+ finalized_window_start,
79
+ window_params.interval_kind ,
80
+ 2 * window_params.window_interval ,
81
+ *window_params.time_zone ,
82
+ window_params.time_scale );
83
+
84
+ auto it = windows_with_buckets.begin ();
85
+ while (next_window_end <= watermark)
86
+ {
87
+ // / Add missing window if not exist
88
+ if (it == windows_with_buckets.end () || next_window_end != it->window .end ) [[unlikely]]
89
+ {
90
+ Window missing_window
91
+ = {addTime (
92
+ next_window_end,
93
+ window_params.interval_kind ,
94
+ -window_params.window_interval ,
95
+ *window_params.time_zone ,
96
+ window_params.time_scale ),
97
+ next_window_end};
98
+ it = windows_with_buckets.insert (it, WindowWithBuckets{.window = std::move (missing_window), .buckets = {}});
99
+ }
100
+
101
+ next_window_end = addTime (
102
+ next_window_end,
103
+ window_params.interval_kind ,
104
+ window_params.window_interval ,
105
+ *window_params.time_zone ,
106
+ window_params.time_scale );
107
+
108
+ ++it;
109
+ }
110
+ }
111
+
68
112
return windows_with_buckets;
69
113
}
70
114
0 commit comments