The constructor is private so from is always aligned to step. An unaligned origin puts the generate_series skeleton and date_bin's output on different boundaries, the LEFT JOIN then matches nothing, and the chart renders as a row of zeroes over a database full of events — a failure that looks like "no data" rather than like a bug.
Value parameters
topN
entries per breakdown. Bounded because each breakdown is ORDER BY count DESC LIMIT ? over the whole window and an unbounded list is both a slow sort and a page nobody reads the end of.
The start of the last bucket that begins before until.
The start of the last bucket that begins before until.
Same reasoning as HistogramRequest.lastBucketStart: generate_series(from, until, width) emits a bucket starting atuntil whenever the span divides evenly, which is a permanent trailing zero bar on every chart whose window is a round number of hours — and every window here is.