{"action":"created","comment":{"url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/comments/46479646","id":46479646,"diff_hunk":"@@ -217,50 +219,52 @@ def hoc_signups\n     # Requested by Roxanne on 16 November 2015 to track HOC 2015 signups by day.\n     authorize! :read, :reports\n \n-    # Get the HOC 2014 and HOC 2015 signup counts by day, deduped by email and name.\n-    # We restrict by dates to avoid long trails of (inappropriate?) signups.\n-    data_2014 = DB[:forms].\n-        where('kind = ? AND created_at > ? AND created_at < ?', 'HocSignup2014', '2014-08-01', '2015-01-01').\n-        group(:name, :email).\n-        # TODO(asher): Is this clumsy notation really necessary? Is Sequel\n-        # really this stupid? Also below.\n-        group_and_count(Sequel.as(Sequel.qualify(:forms, :created_at).cast(:date),:created_at_day)).\n-        order(:created_at_day).\n-        all.\n-        map{|row| [row[:created_at_day].strftime(\"%m-%d\"), row[:count].to_i]}\n-    data_2015 = DB[:forms].\n-        where('kind = ? AND created_at > ? AND created_at < ?', 'HocSignup2015', '2015-08-01', '2016-01-01').\n-        group(:name, :email).\n-        group_and_count(Sequel.as(Sequel.qualify(:forms, :created_at).cast(:date),:created_at_day)).\n-        order(:created_at_day).\n-        all.\n-        map{|row| [row[:created_at_day].strftime(\"%m-%d\"), row[:count].to_i]}\n-\n-    # Construct the hash {MM-DD => [count2014, count2015]}.\n-    # Start by constructing the key space as the union of the MM-DD dates for\n-    # data_2014 and data_2015.\n-    require 'set'\n-    dates = Set.new []\n-    data_2014.each do |day|\n-      dates.add(day[0])\n-    end\n-    data_2015.each do |day|\n-      dates.add(day[0])\n-    end\n-    # Then populate the keys of our hash {date=>[count2014,count2015], ..., date=>[...]} with dates.\n-    data_by_day = {}\n-    dates.each do |date|\n-      data_by_day[date] = [0, 0]\n-    end\n-    # Finally populate the values of our hash.\n-    data_2014.each do |day|\n-      data_by_day[day[0]][0] = day[1]\n-    end\n-    data_2015.each do |day|\n-      data_by_day[day[0]][1] = day[1]\n-    end\n+    SeamlessDatabasePool.use_persistent_read_connection do\n+      # Get the HOC 2014 and HOC 2015 signup counts by day, deduped by email and name.\n+      # We restrict by dates to avoid long trails of (inappropriate?) signups.\n+      data_2014 = DB[:forms].","path":"dashboard/app/controllers/admin_reports_controller.rb","position":null,"original_position":157,"commit_id":"2e27c154974da3efd0df27880ae1c60992b47b5c","original_commit_id":"685633010c8bf8135220130b6cc146fb57435603","user":{"login":"laurelfan","id":7763,"avatar_url":"https://avatars.githubusercontent.com/u/7763?v=3","gravatar_id":"","url":"https://api.github.com/users/laurelfan","html_url":"https://github.com/laurelfan","followers_url":"https://api.github.com/users/laurelfan/followers","following_url":"https://api.github.com/users/laurelfan/following{/other_user}","gists_url":"https://api.github.com/users/laurelfan/gists{/gist_id}","starred_url":"https://api.github.com/users/laurelfan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/laurelfan/subscriptions","organizations_url":"https://api.github.com/users/laurelfan/orgs","repos_url":"https://api.github.com/users/laurelfan/repos","events_url":"https://api.github.com/users/laurelfan/events{/privacy}","received_events_url":"https://api.github.com/users/laurelfan/received_events","type":"User","site_admin":false},"body":"should we just expose the analogous DB_READONLY constant everywhere so you can use it here?","created_at":"2015-12-02T21:42:23Z","updated_at":"2015-12-02T21:42:23Z","html_url":"https://github.com/code-dot-org/code-dot-org/pull/5795#discussion_r46479646","pull_request_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/5795","_links":{"self":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/comments/46479646"},"html":{"href":"https://github.com/code-dot-org/code-dot-org/pull/5795#discussion_r46479646"},"pull_request":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/5795"}}},"pull_request":{"url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/5795","id":52453742,"html_url":"https://github.com/code-dot-org/code-dot-org/pull/5795","diff_url":"https://github.com/code-dot-org/code-dot-org/pull/5795.diff","patch_url":"https://github.com/code-dot-org/code-dot-org/pull/5795.patch","issue_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/5795","number":5795,"state":"open","locked":false,"title":"Changes controllers to use the replica DB rather than the master DB, where appropriate.","user":{"login":"ashercodeorg","id":14206260,"avatar_url":"https://avatars.githubusercontent.com/u/14206260?v=3","gravatar_id":"","url":"https://api.github.com/users/ashercodeorg","html_url":"https://github.com/ashercodeorg","followers_url":"https://api.github.com/users/ashercodeorg/followers","following_url":"https://api.github.com/users/ashercodeorg/following{/other_user}","gists_url":"https://api.github.com/users/ashercodeorg/gists{/gist_id}","starred_url":"https://api.github.com/users/ashercodeorg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ashercodeorg/subscriptions","organizations_url":"https://api.github.com/users/ashercodeorg/orgs","repos_url":"https://api.github.com/users/ashercodeorg/repos","events_url":"https://api.github.com/users/ashercodeorg/events{/privacy}","received_events_url":"https://api.github.com/users/ashercodeorg/received_events","type":"User","site_admin":false},"body":"In particular, cleans up the reports_controller, the admin_reports_controller, and the admin_search_controller.","created_at":"2015-12-02T21:04:05Z","updated_at":"2015-12-02T21:42:23Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c91272b81f7720ce2cccff89721052522ba8e0bb","assignee":{"login":"laurelfan","id":7763,"avatar_url":"https://avatars.githubusercontent.com/u/7763?v=3","gravatar_id":"","url":"https://api.github.com/users/laurelfan","html_url":"https://github.com/laurelfan","followers_url":"https://api.github.com/users/laurelfan/followers","following_url":"https://api.github.com/users/laurelfan/following{/other_user}","gists_url":"https://api.github.com/users/laurelfan/gists{/gist_id}","starred_url":"https://api.github.com/users/laurelfan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/laurelfan/subscriptions","organizations_url":"https://api.github.com/users/laurelfan/orgs","repos_url":"https://api.github.com/users/laurelfan/repos","events_url":"https://api.github.com/users/laurelfan/events{/privacy}","received_events_url":"https://api.github.com/users/laurelfan/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/5795/commits","review_comments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/5795/comments","review_comment_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/comments{/number}","comments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/5795/comments","statuses_url":"https://api.github.com/repos/code-dot-org/code-dot-org/statuses/2e27c154974da3efd0df27880ae1c60992b47b5c","head":{"label":"code-dot-org:use-reporting-db","ref":"use-reporting-db","sha":"2e27c154974da3efd0df27880ae1c60992b47b5c","user":{"login":"code-dot-org","id":5124627,"avatar_url":"https://avatars.githubusercontent.com/u/5124627?v=3","gravatar_id":"","url":"https://api.github.com/users/code-dot-org","html_url":"https://github.com/code-dot-org","followers_url":"https://api.github.com/users/code-dot-org/followers","following_url":"https://api.github.com/users/code-dot-org/following{/other_user}","gists_url":"https://api.github.com/users/code-dot-org/gists{/gist_id}","starred_url":"https://api.github.com/users/code-dot-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/code-dot-org/subscriptions","organizations_url":"https://api.github.com/users/code-dot-org/orgs","repos_url":"https://api.github.com/users/code-dot-org/repos","events_url":"https://api.github.com/users/code-dot-org/events{/privacy}","received_events_url":"https://api.github.com/users/code-dot-org/received_events","type":"Organization","site_admin":false},"repo":{"id":24250009,"name":"code-dot-org","full_name":"code-dot-org/code-dot-org","owner":{"login":"code-dot-org","id":5124627,"avatar_url":"https://avatars.githubusercontent.com/u/5124627?v=3","gravatar_id":"","url":"https://api.github.com/users/code-dot-org","html_url":"https://github.com/code-dot-org","followers_url":"https://api.github.com/users/code-dot-org/followers","following_url":"https://api.github.com/users/code-dot-org/following{/other_user}","gists_url":"https://api.github.com/users/code-dot-org/gists{/gist_id}","starred_url":"https://api.github.com/users/code-dot-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/code-dot-org/subscriptions","organizations_url":"https://api.github.com/users/code-dot-org/orgs","repos_url":"https://api.github.com/users/code-dot-org/repos","events_url":"https://api.github.com/users/code-dot-org/events{/privacy}","received_events_url":"https://api.github.com/users/code-dot-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/code-dot-org/code-dot-org","description":"The code powering code.org and studio.code.org","fork":false,"url":"https://api.github.com/repos/code-dot-org/code-dot-org","forks_url":"https://api.github.com/repos/code-dot-org/code-dot-org/forks","keys_url":"https://api.github.com/repos/code-dot-org/code-dot-org/keys{/key_id}","collaborators_url":"https://api.github.com/repos/code-dot-org/code-dot-org/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/code-dot-org/code-dot-org/teams","hooks_url":"https://api.github.com/repos/code-dot-org/code-dot-org/hooks","issue_events_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/events{/number}","events_url":"https://api.github.com/repos/code-dot-org/code-dot-org/events","assignees_url":"https://api.github.com/repos/code-dot-org/code-dot-org/assignees{/user}","branches_url":"https://api.github.com/repos/code-dot-org/code-dot-org/branches{/branch}","tags_url":"https://api.github.com/repos/code-dot-org/code-dot-org/tags","blobs_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/refs{/sha}","trees_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/trees{/sha}","statuses_url":"https://api.github.com/repos/code-dot-org/code-dot-org/statuses/{sha}","languages_url":"https://api.github.com/repos/code-dot-org/code-dot-org/languages","stargazers_url":"https://api.github.com/repos/code-dot-org/code-dot-org/stargazers","contributors_url":"https://api.github.com/repos/code-dot-org/code-dot-org/contributors","subscribers_url":"https://api.github.com/repos/code-dot-org/code-dot-org/subscribers","subscription_url":"https://api.github.com/repos/code-dot-org/code-dot-org/subscription","commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/commits{/sha}","git_commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/commits{/sha}","comments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/comments{/number}","issue_comment_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/comments{/number}","contents_url":"https://api.github.com/repos/code-dot-org/code-dot-org/contents/{+path}","compare_url":"https://api.github.com/repos/code-dot-org/code-dot-org/compare/{base}...{head}","merges_url":"https://api.github.com/repos/code-dot-org/code-dot-org/merges","archive_url":"https://api.github.com/repos/code-dot-org/code-dot-org/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/code-dot-org/code-dot-org/downloads","issues_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues{/number}","pulls_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls{/number}","milestones_url":"https://api.github.com/repos/code-dot-org/code-dot-org/milestones{/number}","notifications_url":"https://api.github.com/repos/code-dot-org/code-dot-org/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/code-dot-org/code-dot-org/labels{/name}","releases_url":"https://api.github.com/repos/code-dot-org/code-dot-org/releases{/id}","created_at":"2014-09-20T00:46:11Z","updated_at":"2015-12-02T17:34:27Z","pushed_at":"2015-12-02T21:30:13Z","git_url":"git://github.com/code-dot-org/code-dot-org.git","ssh_url":"git@github.com:code-dot-org/code-dot-org.git","clone_url":"https://github.com/code-dot-org/code-dot-org.git","svn_url":"https://github.com/code-dot-org/code-dot-org","homepage":"http://code.org","size":3592175,"stargazers_count":69,"watchers_count":69,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":42,"mirror_url":null,"open_issues_count":66,"forks":42,"open_issues":66,"watchers":69,"default_branch":"staging"}},"base":{"label":"code-dot-org:staging","ref":"staging","sha":"b9f9516aaab87bf923d84fc2b53991fa71707acf","user":{"login":"code-dot-org","id":5124627,"avatar_url":"https://avatars.githubusercontent.com/u/5124627?v=3","gravatar_id":"","url":"https://api.github.com/users/code-dot-org","html_url":"https://github.com/code-dot-org","followers_url":"https://api.github.com/users/code-dot-org/followers","following_url":"https://api.github.com/users/code-dot-org/following{/other_user}","gists_url":"https://api.github.com/users/code-dot-org/gists{/gist_id}","starred_url":"https://api.github.com/users/code-dot-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/code-dot-org/subscriptions","organizations_url":"https://api.github.com/users/code-dot-org/orgs","repos_url":"https://api.github.com/users/code-dot-org/repos","events_url":"https://api.github.com/users/code-dot-org/events{/privacy}","received_events_url":"https://api.github.com/users/code-dot-org/received_events","type":"Organization","site_admin":false},"repo":{"id":24250009,"name":"code-dot-org","full_name":"code-dot-org/code-dot-org","owner":{"login":"code-dot-org","id":5124627,"avatar_url":"https://avatars.githubusercontent.com/u/5124627?v=3","gravatar_id":"","url":"https://api.github.com/users/code-dot-org","html_url":"https://github.com/code-dot-org","followers_url":"https://api.github.com/users/code-dot-org/followers","following_url":"https://api.github.com/users/code-dot-org/following{/other_user}","gists_url":"https://api.github.com/users/code-dot-org/gists{/gist_id}","starred_url":"https://api.github.com/users/code-dot-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/code-dot-org/subscriptions","organizations_url":"https://api.github.com/users/code-dot-org/orgs","repos_url":"https://api.github.com/users/code-dot-org/repos","events_url":"https://api.github.com/users/code-dot-org/events{/privacy}","received_events_url":"https://api.github.com/users/code-dot-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/code-dot-org/code-dot-org","description":"The code powering code.org and studio.code.org","fork":false,"url":"https://api.github.com/repos/code-dot-org/code-dot-org","forks_url":"https://api.github.com/repos/code-dot-org/code-dot-org/forks","keys_url":"https://api.github.com/repos/code-dot-org/code-dot-org/keys{/key_id}","collaborators_url":"https://api.github.com/repos/code-dot-org/code-dot-org/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/code-dot-org/code-dot-org/teams","hooks_url":"https://api.github.com/repos/code-dot-org/code-dot-org/hooks","issue_events_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/events{/number}","events_url":"https://api.github.com/repos/code-dot-org/code-dot-org/events","assignees_url":"https://api.github.com/repos/code-dot-org/code-dot-org/assignees{/user}","branches_url":"https://api.github.com/repos/code-dot-org/code-dot-org/branches{/branch}","tags_url":"https://api.github.com/repos/code-dot-org/code-dot-org/tags","blobs_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/refs{/sha}","trees_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/trees{/sha}","statuses_url":"https://api.github.com/repos/code-dot-org/code-dot-org/statuses/{sha}","languages_url":"https://api.github.com/repos/code-dot-org/code-dot-org/languages","stargazers_url":"https://api.github.com/repos/code-dot-org/code-dot-org/stargazers","contributors_url":"https://api.github.com/repos/code-dot-org/code-dot-org/contributors","subscribers_url":"https://api.github.com/repos/code-dot-org/code-dot-org/subscribers","subscription_url":"https://api.github.com/repos/code-dot-org/code-dot-org/subscription","commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/commits{/sha}","git_commits_url":"https://api.github.com/repos/code-dot-org/code-dot-org/git/commits{/sha}","comments_url":"https://api.github.com/repos/code-dot-org/code-dot-org/comments{/number}","issue_comment_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/comments{/number}","contents_url":"https://api.github.com/repos/code-dot-org/code-dot-org/contents/{+path}","compare_url":"https://api.github.com/repos/code-dot-org/code-dot-org/compare/{base}...{head}","merges_url":"https://api.github.com/repos/code-dot-org/code-dot-org/merges","archive_url":"https://api.github.com/repos/code-dot-org/code-dot-org/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/code-dot-org/code-dot-org/downloads","issues_url":"https://api.github.com/repos/code-dot-org/code-dot-org/issues{/number}","pulls_url":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls{/number}","milestones_url":"https://api.github.com/repos/code-dot-org/code-dot-org/milestones{/number}","notifications_url":"https://api.github.com/repos/code-dot-org/code-dot-org/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/code-dot-org/code-dot-org/labels{/name}","releases_url":"https://api.github.com/repos/code-dot-org/code-dot-org/releases{/id}","created_at":"2014-09-20T00:46:11Z","updated_at":"2015-12-02T17:34:27Z","pushed_at":"2015-12-02T21:30:13Z","git_url":"git://github.com/code-dot-org/code-dot-org.git","ssh_url":"git@github.com:code-dot-org/code-dot-org.git","clone_url":"https://github.com/code-dot-org/code-dot-org.git","svn_url":"https://github.com/code-dot-org/code-dot-org","homepage":"http://code.org","size":3592175,"stargazers_count":69,"watchers_count":69,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":42,"mirror_url":null,"open_issues_count":66,"forks":42,"open_issues":66,"watchers":69,"default_branch":"staging"}},"_links":{"self":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/5795"},"html":{"href":"https://github.com/code-dot-org/code-dot-org/pull/5795"},"issue":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/5795"},"comments":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/issues/5795/comments"},"review_comments":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/5795/comments"},"review_comment":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/pulls/5795/commits"},"statuses":{"href":"https://api.github.com/repos/code-dot-org/code-dot-org/statuses/2e27c154974da3efd0df27880ae1c60992b47b5c"}}}}