Rename fetch_story_stats() to collect_story_stats() for added clarity
Rename "do_not_overwrite" to "overwrite" parameter to get rid of double negation; make the worker *not* overwrite by default
Add helper subroutine to read Bit.ly processing results from GridFS
Add columns to "story_link_counts" and "medium_link_counts" to store calculated Bit.ly stats; add table "story_bitly_statistics" to store click / referrer counts for each story; add function "upsert_story_bitly_statistics" to INSERT / UPDATE said statistics to the table; add function "all_controversy_stories_have_bitly_statistics" to check whether all controversy's stories have been processed through the full Bit.ly chain
Add MediaWords::GearmanFunction::Bitly::AggregateStoryStats Gearman worker which reads Bit.ly stats from GridFS, calculates the story click / referrer counts and stores them in "story_bitly_statistics" table; make FetchStoryStats worker enqueue an AggregateStoryStats job after each completed story
When creating a controversy dump, generate Bit.ly story / media counts too
Refuse to continue with controversy's dump if not all controversy's stories have gone through the full Bit.ly chain
Print Bit.ly click / referrer counts in (most) web UI parts relevant to CM dump