{"action":"created","comment":{"url":"https://api.github.com/repos/linkedin/pinot/pulls/comments/99006305","pull_request_review_id":19436374,"id":99006305,"diff_hunk":"@@ -0,0 +1,300 @@\n+/**\n+ * Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com)\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *         http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+package com.linkedin.pinot.integration.tests;\n+\n+import com.alibaba.fastjson.JSON;\n+import com.alibaba.fastjson.JSONArray;\n+import com.alibaba.fastjson.JSONObject;\n+import com.linkedin.pinot.controller.helix.ControllerRequestURLBuilder;\n+import java.io.File;\n+import java.util.ArrayList;\n+import java.util.List;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+import org.testng.annotations.BeforeClass;\n+import org.testng.annotations.Test;\n+import com.linkedin.pinot.common.data.Schema;\n+import com.linkedin.pinot.common.utils.FileUploadUtils;\n+import com.linkedin.pinot.common.utils.KafkaStarterUtils;\n+import junit.framework.Assert;\n+\n+\n+/**\n+ * Hybrid cluster integration test that uploads 8 months of data as offline and 6 months of data as realtime (with a\n+ * two month overlap) then deletes segments different ways to test delete APIs.\n+ *\n+ */\n+public class DeleteAPIHybridClusterIntegrationTest extends HybridClusterIntegrationTest {\n+  private static final Logger LOGGER = LoggerFactory.getLogger(RealtimeClusterIntegrationTest.class);\n+  private String TABLE_NAME;\n+  private int nOfflineRows;\n+  private int nRealtimeRows;\n+\n+  @BeforeClass\n+  public void setUp() throws Exception {\n+    super.setUp();\n+    TABLE_NAME = super.getTableName();\n+    nOfflineRows = numRowsReturned(\"REALTIME\");\n+    nRealtimeRows = numRowsReturned(\"OFFLINE\");\n+  }\n+\n+  private int numRowsReturned(String tableType) throws Exception {\n+    org.json.JSONObject response = postQuery(\"select count(*) from '\" + TABLE_NAME + \"_\" + tableType + \"'\");\n+    long start = System.currentTimeMillis();\n+    long end = start + 60 * 1000;\n+    while (System.currentTimeMillis() < end) {\n+      if (!response.get(\"numDocsScanned\").equals(new Integer(0))) {\n+        String pinotValue = ((org.json.JSONArray) response.get(\"aggregationResults\")).getJSONObject(0).get(\"value\").toString();\n+        return Integer.parseInt(pinotValue);\n+      }\n+      Thread.sleep(200);\n+    }\n+    return 0;\n+  }\n+\n+  private boolean checkAllRowsDeleted(String tableType) throws Exception {\n+    org.json.JSONObject response = postQuery(\"select count(*) from '\" + TABLE_NAME + \"_\" + tableType + \"'\");\n+    long start = System.currentTimeMillis();\n+    long end = start + 60 * 1000;\n+    while (System.currentTimeMillis() < end) {\n+      if (response.get(\"numDocsScanned\").equals(new Integer(0))) {\n+        return true;\n+      }\n+      Thread.sleep(200);\n+    }\n+    return false;\n+  }\n+\n+  private void waitForTableReady() throws Exception {\n+    long start = System.currentTimeMillis();\n+    long end = start + 60 * 1000;\n+    while (System.currentTimeMillis() < end) {\n+      int curOfflineRows = numRowsReturned(\"offline\");\n+      if (curOfflineRows != nOfflineRows) {\n+        Thread.sleep(200);\n+      } else {\n+        break;\n+      }\n+    }\n+  }\n+\n+  // @Test TODO: Add back when we use LLC only\n+  public void deleteAllRealtimeSegmentsFromGetAPI() throws Exception{\n+    sendGetRequest(ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).\n+        forDeleteAllSegmentsWithTypeWithGetAPI(TABLE_NAME, \"realtime\"));\n+\n+    checkAllRowsDeleted(\"REALTIME\");\n+\n+    String postDeleteSegmentList = sendGetRequest(\n+        ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).forListAllSegments(TABLE_NAME));\n+    Assert.assertEquals(getSegmentsFromJson(postDeleteSegmentList, \"realtime\").size(), 1);\n+    Assert.assertNotSame(getSegmentsFromJson(postDeleteSegmentList, \"offline\").size(), 0);\n+\n+    repushRealtimeSegments();\n+  }\n+\n+  private boolean checkOneRowDeleted(String tableType) throws Exception {\n+    org.json.JSONObject response = postQuery(\"select count(*) from '\" + TABLE_NAME + \"_\" + tableType + \"'\");\n+    long start = System.currentTimeMillis();\n+    long end = start + 60 * 1000;\n+    while (System.currentTimeMillis() < end) {\n+      if (tableType.equals(\"REALTIME\")) {\n+        if (Integer.parseInt(((org.json.JSONArray) response.get(\"aggregationResults\")).getJSONObject(0).get(\"value\").toString()) != nRealtimeRows) {\n+          return true;\n+        }\n+      } else {\n+        if (Integer.parseInt(((org.json.JSONArray) response.get(\"aggregationResults\")).getJSONObject(0).get(\"value\").toString()) != nOfflineRows) {\n+          return true;\n+        }\n+      }\n+      Thread.sleep(200);\n+    }\n+    return false;\n+  }\n+\n+  @Test\n+  public void deleteAllOfflineSegmentsFromGetAPI() throws Exception{\n+    sendGetRequest(ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).\n+        forDeleteAllSegmentsWithTypeWithGetAPI(TABLE_NAME, \"offline\"));\n+\n+    checkAllRowsDeleted(\"OFFLINE\");\n+\n+    String postDeleteSegmentList = sendGetRequest(\n+        ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).forListAllSegments(TABLE_NAME));\n+    Assert.assertEquals(getSegmentsFromJson(postDeleteSegmentList, \"offline\"), null);\n+    Assert.assertNotSame(getSegmentsFromJson(postDeleteSegmentList, \"realtime\").size(), 0);\n+\n+    repushOfflineSegments();\n+  }\n+\n+  @Override // Leaving this out because it is done in the superclass\n+  public void testHardcodedQuerySet() {}\n+\n+  @Test\n+  public void deleteOfflineSegmentFromGetAPI() throws Exception{\n+    String segmentList = sendGetRequest(\n+        ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).forListAllSegments(TABLE_NAME));\n+    JSONArray offlineSegmentsList = getSegmentsFromJson(segmentList, \"offline\");\n+\n+    String removedSegment = offlineSegmentsList.get(0).toString();\n+\n+    sendGetRequest(ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).\n+        forDeleteSegmentWithGetAPI(TABLE_NAME, removedSegment, \"offline\"));\n+\n+    checkOneRowDeleted(\"OFFLINE\");\n+\n+    String postDeleteSegmentList = sendGetRequest(\n+        ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).forListAllSegments(TABLE_NAME));\n+    JSONArray offlineSegmentsListReturn = getSegmentsFromJson(postDeleteSegmentList, \"offline\");\n+    offlineSegmentsList.remove(removedSegment);\n+    Assert.assertEquals(offlineSegmentsListReturn, offlineSegmentsList);\n+  }\n+\n+  @Override // Leaving this out because it is done in the superclass\n+  public void testGeneratedQueriesWithMultiValues() {}\n+\n+  @Test\n+  public void deleteRealtimeSegmentFromGetAPI() throws Exception{\n+    String segmentList = sendGetRequest(\n+        ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).forListAllSegments(TABLE_NAME));\n+    JSONArray realtimeSegmentsList = getSegmentsFromJson(segmentList, \"realtime\");\n+\n+    String removedSegment = realtimeSegmentsList.get(0).toString();\n+\n+    sendGetRequest(ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).\n+        forDeleteSegmentWithGetAPI(TABLE_NAME, removedSegment, \"realtime\"));\n+\n+    checkOneRowDeleted(\"REALTIME\");\n+\n+    String postDeleteSegmentList = sendGetRequest(\n+        ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).forListAllSegments(TABLE_NAME));\n+    JSONArray realtimeSegmentsListReturn = getSegmentsFromJson(postDeleteSegmentList, \"realtime\");\n+    realtimeSegmentsList.remove(removedSegment);\n+    Assert.assertEquals(realtimeSegmentsListReturn, realtimeSegmentsList);\n+  }\n+\n+  // @Test TODO: Add back when we use LLC only\n+  public void deleteAllRealtimeSegmentsFromDeleteAPI() throws Exception{\n+    sendDeleteRequest(ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).\n+        forSegmentDeleteAllAPI(TABLE_NAME, \"realtime\"));\n+\n+    checkAllRowsDeleted(\"REALTIME\");\n+\n+    String postDeleteSegmentList = sendGetRequest(\n+        ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).forListAllSegments(TABLE_NAME));\n+    Assert.assertEquals(getSegmentsFromJson(postDeleteSegmentList, \"realtime\").size(), 1);\n+    Assert.assertNotSame(getSegmentsFromJson(postDeleteSegmentList, \"offline\").size(), 0);\n+\n+     repushRealtimeSegments();\n+  }\n+\n+    @Test\n+    public void deleteAllOfflineSegmentsFromDeleteAPI() throws Exception{\n+      sendDeleteRequest(ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).\n+          forSegmentDeleteAllAPI(TABLE_NAME, \"offline\"));\n+\n+      checkAllRowsDeleted(\"OFFLINE\");\n+\n+      String postDeleteSegmentList = sendGetRequest(\n+          ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).forListAllSegments(TABLE_NAME));\n+      Assert.assertEquals(getSegmentsFromJson(postDeleteSegmentList, \"offline\"), null);\n+      Assert.assertNotSame(getSegmentsFromJson(postDeleteSegmentList, \"realtime\").size(), 0);\n+\n+      repushOfflineSegments();\n+    }\n+\n+    @Test\n+    public void deleteOfflineSegmentFromDeleteAPI() throws Exception{\n+      String segmentList = sendGetRequest(\n+          ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).forListAllSegments(TABLE_NAME));\n+      JSONArray offlineSegmentsList = getSegmentsFromJson(segmentList, \"offline\");\n+\n+      String removedSegment = offlineSegmentsList.get(0).toString();\n+\n+      sendDeleteRequest(ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).\n+          forSegmentDeleteAPI(TABLE_NAME, removedSegment, \"offline\"));\n+\n+      checkOneRowDeleted(\"OFFLINE\");\n+\n+      String postDeleteSegmentList = sendGetRequest(\n+          ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).forListAllSegments(TABLE_NAME));\n+      JSONArray offlineSegmentsListReturn = getSegmentsFromJson(postDeleteSegmentList, \"offline\");\n+      offlineSegmentsList.remove(removedSegment);\n+      Assert.assertEquals(offlineSegmentsListReturn, offlineSegmentsList);\n+    }\n+\n+  @Test\n+  public void deleteRealtimeSegmentFromDeleteAPI() throws Exception{\n+    String segmentList = sendGetRequest(\n+        ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).forListAllSegments(TABLE_NAME));\n+    JSONArray realtimeSegmentsList = getSegmentsFromJson(segmentList, \"realtime\");\n+\n+    String removedSegment = realtimeSegmentsList.get(0).toString();\n+\n+    sendDeleteRequest(ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).\n+        forSegmentDeleteAPI(TABLE_NAME, removedSegment, \"realtime\"));\n+\n+    checkOneRowDeleted(\"REALTIME\");\n+\n+    String postDeleteSegmentList = sendGetRequest(\n+        ControllerRequestURLBuilder.baseUrl(CONTROLLER_BASE_API_URL).forListAllSegments(TABLE_NAME));\n+    JSONArray realtimeSegmentsListReturn = getSegmentsFromJson(postDeleteSegmentList, \"realtime\");\n+    realtimeSegmentsList.remove(removedSegment);\n+    Assert.assertEquals(realtimeSegmentsListReturn, realtimeSegmentsList);\n+  }\n+\n+  private JSONArray getSegmentsFromJson(String json, String type) {\n+    if (type.equalsIgnoreCase(\"realtime\")) {\n+      com.alibaba.fastjson.JSONObject jsonObject2 = (JSONObject) JSON.parseArray(json).get(0);\n+      String jsonObject3 = (String) jsonObject2.get(\"segments\");\n+      return (JSONArray) JSON.parseObject(jsonObject3).get(\"Server_172.21.224.26_8099\");","path":"pinot-integration-tests/src/test/java/com/linkedin/pinot/integration/tests/DeleteAPIHybridClusterIntegrationTest.java","position":263,"original_position":263,"commit_id":"51df76392962571d3fbbbf0c7bb8f89323305c23","original_commit_id":"51df76392962571d3fbbbf0c7bb8f89323305c23","user":{"login":"mcvsubbu","id":2279037,"avatar_url":"https://avatars.githubusercontent.com/u/2279037?v=3","gravatar_id":"","url":"https://api.github.com/users/mcvsubbu","html_url":"https://github.com/mcvsubbu","followers_url":"https://api.github.com/users/mcvsubbu/followers","following_url":"https://api.github.com/users/mcvsubbu/following{/other_user}","gists_url":"https://api.github.com/users/mcvsubbu/gists{/gist_id}","starred_url":"https://api.github.com/users/mcvsubbu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mcvsubbu/subscriptions","organizations_url":"https://api.github.com/users/mcvsubbu/orgs","repos_url":"https://api.github.com/users/mcvsubbu/repos","events_url":"https://api.github.com/users/mcvsubbu/events{/privacy}","received_events_url":"https://api.github.com/users/mcvsubbu/received_events","type":"User","site_admin":false},"body":"hardcoding ip address? will not work on other machines right?","created_at":"2017-02-01T21:58:37Z","updated_at":"2017-02-01T21:59:05Z","html_url":"https://github.com/linkedin/pinot/pull/982#discussion_r99006305","pull_request_url":"https://api.github.com/repos/linkedin/pinot/pulls/982","_links":{"self":{"href":"https://api.github.com/repos/linkedin/pinot/pulls/comments/99006305"},"html":{"href":"https://github.com/linkedin/pinot/pull/982#discussion_r99006305"},"pull_request":{"href":"https://api.github.com/repos/linkedin/pinot/pulls/982"}}},"pull_request":{"url":"https://api.github.com/repos/linkedin/pinot/pulls/982","id":102568703,"html_url":"https://github.com/linkedin/pinot/pull/982","diff_url":"https://github.com/linkedin/pinot/pull/982.diff","patch_url":"https://github.com/linkedin/pinot/pull/982.patch","issue_url":"https://api.github.com/repos/linkedin/pinot/issues/982","number":982,"state":"open","locked":false,"title":"Fixing segment Deletion API","user":{"login":"jenniferdai","id":5035129,"avatar_url":"https://avatars.githubusercontent.com/u/5035129?v=3","gravatar_id":"","url":"https://api.github.com/users/jenniferdai","html_url":"https://github.com/jenniferdai","followers_url":"https://api.github.com/users/jenniferdai/followers","following_url":"https://api.github.com/users/jenniferdai/following{/other_user}","gists_url":"https://api.github.com/users/jenniferdai/gists{/gist_id}","starred_url":"https://api.github.com/users/jenniferdai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jenniferdai/subscriptions","organizations_url":"https://api.github.com/users/jenniferdai/orgs","repos_url":"https://api.github.com/users/jenniferdai/repos","events_url":"https://api.github.com/users/jenniferdai/events{/privacy}","received_events_url":"https://api.github.com/users/jenniferdai/received_events","type":"User","site_admin":false},"body":"* PINOT-4349\r\n* Previously, if the tableType was null, and the table has both realtime and offline components, we look for the segment in the realtime table, and don't find anything there and throw an error. Now, we check to ensure the table type is correct by looking at the segment metadata.\r\n* Will test with a breakpoint in the integration test & deleting segments in both APIs\r\n","created_at":"2017-01-21T03:33:02Z","updated_at":"2017-02-01T21:59:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b3c57e2f241aaa067b0c99e7cdc0363291b8faed","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/linkedin/pinot/pulls/982/commits","review_comments_url":"https://api.github.com/repos/linkedin/pinot/pulls/982/comments","review_comment_url":"https://api.github.com/repos/linkedin/pinot/pulls/comments{/number}","comments_url":"https://api.github.com/repos/linkedin/pinot/issues/982/comments","statuses_url":"https://api.github.com/repos/linkedin/pinot/statuses/51df76392962571d3fbbbf0c7bb8f89323305c23","head":{"label":"jenniferdai:segmentDeletionAPI","ref":"segmentDeletionAPI","sha":"51df76392962571d3fbbbf0c7bb8f89323305c23","user":{"login":"jenniferdai","id":5035129,"avatar_url":"https://avatars.githubusercontent.com/u/5035129?v=3","gravatar_id":"","url":"https://api.github.com/users/jenniferdai","html_url":"https://github.com/jenniferdai","followers_url":"https://api.github.com/users/jenniferdai/followers","following_url":"https://api.github.com/users/jenniferdai/following{/other_user}","gists_url":"https://api.github.com/users/jenniferdai/gists{/gist_id}","starred_url":"https://api.github.com/users/jenniferdai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jenniferdai/subscriptions","organizations_url":"https://api.github.com/users/jenniferdai/orgs","repos_url":"https://api.github.com/users/jenniferdai/repos","events_url":"https://api.github.com/users/jenniferdai/events{/privacy}","received_events_url":"https://api.github.com/users/jenniferdai/received_events","type":"User","site_admin":false},"repo":{"id":78037884,"name":"pinot","full_name":"jenniferdai/pinot","owner":{"login":"jenniferdai","id":5035129,"avatar_url":"https://avatars.githubusercontent.com/u/5035129?v=3","gravatar_id":"","url":"https://api.github.com/users/jenniferdai","html_url":"https://github.com/jenniferdai","followers_url":"https://api.github.com/users/jenniferdai/followers","following_url":"https://api.github.com/users/jenniferdai/following{/other_user}","gists_url":"https://api.github.com/users/jenniferdai/gists{/gist_id}","starred_url":"https://api.github.com/users/jenniferdai/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jenniferdai/subscriptions","organizations_url":"https://api.github.com/users/jenniferdai/orgs","repos_url":"https://api.github.com/users/jenniferdai/repos","events_url":"https://api.github.com/users/jenniferdai/events{/privacy}","received_events_url":"https://api.github.com/users/jenniferdai/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jenniferdai/pinot","description":"A realtime distributed OLAP datastore","fork":true,"url":"https://api.github.com/repos/jenniferdai/pinot","forks_url":"https://api.github.com/repos/jenniferdai/pinot/forks","keys_url":"https://api.github.com/repos/jenniferdai/pinot/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jenniferdai/pinot/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jenniferdai/pinot/teams","hooks_url":"https://api.github.com/repos/jenniferdai/pinot/hooks","issue_events_url":"https://api.github.com/repos/jenniferdai/pinot/issues/events{/number}","events_url":"https://api.github.com/repos/jenniferdai/pinot/events","assignees_url":"https://api.github.com/repos/jenniferdai/pinot/assignees{/user}","branches_url":"https://api.github.com/repos/jenniferdai/pinot/branches{/branch}","tags_url":"https://api.github.com/repos/jenniferdai/pinot/tags","blobs_url":"https://api.github.com/repos/jenniferdai/pinot/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jenniferdai/pinot/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jenniferdai/pinot/git/refs{/sha}","trees_url":"https://api.github.com/repos/jenniferdai/pinot/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jenniferdai/pinot/statuses/{sha}","languages_url":"https://api.github.com/repos/jenniferdai/pinot/languages","stargazers_url":"https://api.github.com/repos/jenniferdai/pinot/stargazers","contributors_url":"https://api.github.com/repos/jenniferdai/pinot/contributors","subscribers_url":"https://api.github.com/repos/jenniferdai/pinot/subscribers","subscription_url":"https://api.github.com/repos/jenniferdai/pinot/subscription","commits_url":"https://api.github.com/repos/jenniferdai/pinot/commits{/sha}","git_commits_url":"https://api.github.com/repos/jenniferdai/pinot/git/commits{/sha}","comments_url":"https://api.github.com/repos/jenniferdai/pinot/comments{/number}","issue_comment_url":"https://api.github.com/repos/jenniferdai/pinot/issues/comments{/number}","contents_url":"https://api.github.com/repos/jenniferdai/pinot/contents/{+path}","compare_url":"https://api.github.com/repos/jenniferdai/pinot/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jenniferdai/pinot/merges","archive_url":"https://api.github.com/repos/jenniferdai/pinot/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jenniferdai/pinot/downloads","issues_url":"https://api.github.com/repos/jenniferdai/pinot/issues{/number}","pulls_url":"https://api.github.com/repos/jenniferdai/pinot/pulls{/number}","milestones_url":"https://api.github.com/repos/jenniferdai/pinot/milestones{/number}","notifications_url":"https://api.github.com/repos/jenniferdai/pinot/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jenniferdai/pinot/labels{/name}","releases_url":"https://api.github.com/repos/jenniferdai/pinot/releases{/id}","deployments_url":"https://api.github.com/repos/jenniferdai/pinot/deployments","created_at":"2017-01-04T17:34:23Z","updated_at":"2017-01-04T17:34:32Z","pushed_at":"2017-02-01T18:49:07Z","git_url":"git://github.com/jenniferdai/pinot.git","ssh_url":"git@github.com:jenniferdai/pinot.git","clone_url":"https://github.com/jenniferdai/pinot.git","svn_url":"https://github.com/jenniferdai/pinot","homepage":"https://github.com/linkedin/pinot/wiki","size":136489,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"linkedin:master","ref":"master","sha":"51783e3d16fb6a9598037b3ab7112f09d6b19166","user":{"login":"linkedin","id":357098,"avatar_url":"https://avatars.githubusercontent.com/u/357098?v=3","gravatar_id":"","url":"https://api.github.com/users/linkedin","html_url":"https://github.com/linkedin","followers_url":"https://api.github.com/users/linkedin/followers","following_url":"https://api.github.com/users/linkedin/following{/other_user}","gists_url":"https://api.github.com/users/linkedin/gists{/gist_id}","starred_url":"https://api.github.com/users/linkedin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/linkedin/subscriptions","organizations_url":"https://api.github.com/users/linkedin/orgs","repos_url":"https://api.github.com/users/linkedin/repos","events_url":"https://api.github.com/users/linkedin/events{/privacy}","received_events_url":"https://api.github.com/users/linkedin/received_events","type":"Organization","site_admin":false},"repo":{"id":19961085,"name":"pinot","full_name":"linkedin/pinot","owner":{"login":"linkedin","id":357098,"avatar_url":"https://avatars.githubusercontent.com/u/357098?v=3","gravatar_id":"","url":"https://api.github.com/users/linkedin","html_url":"https://github.com/linkedin","followers_url":"https://api.github.com/users/linkedin/followers","following_url":"https://api.github.com/users/linkedin/following{/other_user}","gists_url":"https://api.github.com/users/linkedin/gists{/gist_id}","starred_url":"https://api.github.com/users/linkedin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/linkedin/subscriptions","organizations_url":"https://api.github.com/users/linkedin/orgs","repos_url":"https://api.github.com/users/linkedin/repos","events_url":"https://api.github.com/users/linkedin/events{/privacy}","received_events_url":"https://api.github.com/users/linkedin/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/linkedin/pinot","description":"A realtime distributed OLAP datastore","fork":false,"url":"https://api.github.com/repos/linkedin/pinot","forks_url":"https://api.github.com/repos/linkedin/pinot/forks","keys_url":"https://api.github.com/repos/linkedin/pinot/keys{/key_id}","collaborators_url":"https://api.github.com/repos/linkedin/pinot/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/linkedin/pinot/teams","hooks_url":"https://api.github.com/repos/linkedin/pinot/hooks","issue_events_url":"https://api.github.com/repos/linkedin/pinot/issues/events{/number}","events_url":"https://api.github.com/repos/linkedin/pinot/events","assignees_url":"https://api.github.com/repos/linkedin/pinot/assignees{/user}","branches_url":"https://api.github.com/repos/linkedin/pinot/branches{/branch}","tags_url":"https://api.github.com/repos/linkedin/pinot/tags","blobs_url":"https://api.github.com/repos/linkedin/pinot/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/linkedin/pinot/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/linkedin/pinot/git/refs{/sha}","trees_url":"https://api.github.com/repos/linkedin/pinot/git/trees{/sha}","statuses_url":"https://api.github.com/repos/linkedin/pinot/statuses/{sha}","languages_url":"https://api.github.com/repos/linkedin/pinot/languages","stargazers_url":"https://api.github.com/repos/linkedin/pinot/stargazers","contributors_url":"https://api.github.com/repos/linkedin/pinot/contributors","subscribers_url":"https://api.github.com/repos/linkedin/pinot/subscribers","subscription_url":"https://api.github.com/repos/linkedin/pinot/subscription","commits_url":"https://api.github.com/repos/linkedin/pinot/commits{/sha}","git_commits_url":"https://api.github.com/repos/linkedin/pinot/git/commits{/sha}","comments_url":"https://api.github.com/repos/linkedin/pinot/comments{/number}","issue_comment_url":"https://api.github.com/repos/linkedin/pinot/issues/comments{/number}","contents_url":"https://api.github.com/repos/linkedin/pinot/contents/{+path}","compare_url":"https://api.github.com/repos/linkedin/pinot/compare/{base}...{head}","merges_url":"https://api.github.com/repos/linkedin/pinot/merges","archive_url":"https://api.github.com/repos/linkedin/pinot/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/linkedin/pinot/downloads","issues_url":"https://api.github.com/repos/linkedin/pinot/issues{/number}","pulls_url":"https://api.github.com/repos/linkedin/pinot/pulls{/number}","milestones_url":"https://api.github.com/repos/linkedin/pinot/milestones{/number}","notifications_url":"https://api.github.com/repos/linkedin/pinot/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/linkedin/pinot/labels{/name}","releases_url":"https://api.github.com/repos/linkedin/pinot/releases{/id}","deployments_url":"https://api.github.com/repos/linkedin/pinot/deployments","created_at":"2014-05-19T23:27:48Z","updated_at":"2017-01-31T22:11:55Z","pushed_at":"2017-02-01T21:50:49Z","git_url":"git://github.com/linkedin/pinot.git","ssh_url":"git@github.com:linkedin/pinot.git","clone_url":"https://github.com/linkedin/pinot.git","svn_url":"https://github.com/linkedin/pinot","homepage":"https://github.com/linkedin/pinot/wiki","size":136452,"stargazers_count":1410,"watchers_count":1410,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":244,"mirror_url":null,"open_issues_count":91,"forks":244,"open_issues":91,"watchers":1410,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/linkedin/pinot/pulls/982"},"html":{"href":"https://github.com/linkedin/pinot/pull/982"},"issue":{"href":"https://api.github.com/repos/linkedin/pinot/issues/982"},"comments":{"href":"https://api.github.com/repos/linkedin/pinot/issues/982/comments"},"review_comments":{"href":"https://api.github.com/repos/linkedin/pinot/pulls/982/comments"},"review_comment":{"href":"https://api.github.com/repos/linkedin/pinot/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/linkedin/pinot/pulls/982/commits"},"statuses":{"href":"https://api.github.com/repos/linkedin/pinot/statuses/51df76392962571d3fbbbf0c7bb8f89323305c23"}}}}
{"actor":{"display_login":"mcvsubbu"}}