GitHub PullRequestReviewCommentEvent at 2014-10-28 16:54:41
Repository: voltdb
Actor: cwolff-voltdb
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/VoltDB/voltdb/pulls/comments/19485105","id":19485105,"diff_hunk":"@@ -210,21 +196,162 @@ public void testTableLimitAndPercentage() throws Exception {\n         validateTableOfScalarLongs(vt, new long[] {1});\n         validStatisticsForTableLimitAndPercentage(client, \"CAPPED3\", 3, 100);\n \n-        e = null;\n-        try {\n-            vt = client.callProcedure(\"CAPPED3.insert\", 3, 3, 3).getResults()[0];\n-        } catch (ProcCallException ex) {\n-            e = ex;\n-            assertTrue(ex.getMessage().contains(\"CONSTRAINT VIOLATION\"));\n-            assertTrue(ex.getMessage().contains(\"Table CAPPED3 exceeds table maximum row count 3\"));\n-        } finally {\n-            assertNotNull(e);\n-        }\n+        verifyProcFails(client, \"CONSTRAINT VIOLATION\\\\s*Table CAPPED3 exceeds table maximum row count 3\",\n+                \"CAPPED3.insert\", 3, 3, 3);\n+\n+        // This should also fail if attempting to insert a row via INSERT INTO ... SELECT.\n+        verifyStmtFails(client, \"insert into capped3 select * from capped2\",\n+                \"CONSTRAINT VIOLATION\\\\s*Table CAPPED3 exceeds table maximum row count 3\");\n+\n         vt = client.callProcedure(\"@AdHoc\", \"select count(*) from CAPPED3\").getResults()[0];\n         validateTableOfScalarLongs(vt, new long[] {3});\n \n     }\n \n+    public void testTableLimitPartitionRowsExec() throws IOException, ProcCallException {\n+\n+        if (isHSQL())\n+                return;\n+\n+        Client client = getClient();\n+\n+        // CAPPED3_LIMIT_ROWS_EXEC is a special table whose name is recognized by the EE.\n+        // The EE will execute a purge fragment when executing inserts on this table when\n+        // it's at its 3-row limit:\n+        //\n+        //  DELETE FROM capped3_limit_rows_exec WHERE purge_me <> 0\n+\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 0, 10, 20);\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 0, 20, 40);\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 0, 30, 60);\n+\n+        // purge fragment executed but deletes no rows... insert still fails.\n+        verifyProcFails(client,\n+                        \"CONSTRAINT VIOLATION\\\\s*Table CAPPED3_LIMIT_ROWS_EXEC exceeds table maximum row count 3\",\n+                        \"CAPPED3_LIMIT_ROWS_EXEC.insert\", 0, 40, 80);\n+\n+        // If we update the PURGE_ME field, the purge fragment will delete a row on the next insert,\n+        // allowing it to succeed.\n+        client.callProcedure(\"@AdHoc\", \"UPDATE CAPPED3_LIMIT_ROWS_EXEC SET PURGE_ME = 1 WHERE WAGE = 10\");\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 0, 40, 80);\n+\n+        // Verify the row where WAGE == 10 was deleted.\n+        String selectAll = \"SELECT * FROM CAPPED3_LIMIT_ROWS_EXEC ORDER BY WAGE\";\n+        VoltTable vt = client.callProcedure(\"@AdHoc\", selectAll).getResults()[0];\n+        validateTableOfLongs(vt, new long[][] {{0, 20, 40}, {0, 30, 60}, {0, 40, 80}});\n+\n+        // This mark two rows to be purged.\n+        client.callProcedure(\"@AdHoc\",\n+                        \"UPDATE CAPPED3_LIMIT_ROWS_EXEC SET PURGE_ME = 1 WHERE WAGE IN (20, 40)\");\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 0, 50, 100);\n+        vt = client.callProcedure(\"@AdHoc\", selectAll).getResults()[0];\n+        validateTableOfLongs(vt, new long[][] {{0, 30, 60}, {0, 50, 100}});\n+\n+        // Let's top off the table again\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 0, 60, 120);\n+\n+        // Now mark them all to be purged\n+        client.callProcedure(\"@AdHoc\", \"UPDATE CAPPED3_LIMIT_ROWS_EXEC SET PURGE_ME = 1\");\n+\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 0, 70, 140);\n+        vt = client.callProcedure(\"@AdHoc\", selectAll).getResults()[0];\n+        validateTableOfLongs(vt, new long[][] {{0, 70, 140}});\n+\n+        // Delete remaining row\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.delete\", 70);\n+    }\n+\n+    public void testTableLimitPartitionRowsExecUnique() throws IOException, ProcCallException {\n+\n+        if (isHSQL())\n+                return;\n+\n+        Client client = getClient();\n+\n+        // insert into table when it's full, but the\n+        // - row to be inserted would violate a uniqueness constraint on the table.\n+        //   The insert should fail, and the delete should be rolled back.\n+        // - row to be inserted would violate a uniqueness constraint, but the\n+        //   duplicate row will be purged.  In our current implementation,\n+        //   this will succeed.\n+\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 0, 10, 20);\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 1, 20, 40);\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 1, 30, 60);\n+\n+        verifyProcFails(client,\n+                        \"Constraint Type UNIQUE, Table CatalogId CAPPED3_LIMIT_ROWS_EXEC\",\n+                        \"CAPPED3_LIMIT_ROWS_EXEC.insert\", 0, 10, 20);\n+\n+        // Should still be three rows\n+        String selectAll = \"SELECT * FROM CAPPED3_LIMIT_ROWS_EXEC ORDER BY WAGE\";\n+        VoltTable vt = client.callProcedure(\"@AdHoc\", selectAll).getResults()[0];\n+        validateTableOfLongs(vt, new long[][] {{0, 10, 20}, {1, 20, 40}, {1, 30, 60}});\n+\n+        // Now try to insert a row with PK value same as an existing row that will be purged.\n+        // Insert will succeed in this case.\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 0, 20, 99);\n+        vt = client.callProcedure(\"@AdHoc\", selectAll).getResults()[0];\n+        validateTableOfLongs(vt, new long[][] {{0, 10, 20}, {0, 20, 99}});\n+\n+        client.callProcedure(\"@AdHoc\", \"DELETE FROM CAPPED3_LIMIT_ROWS_EXEC\");\n+    }\n+\n+    public void testTableLimitPartitionRowsExecMultiRow() throws IOException, ProcCallException {\n+\n+        if (isHSQL())\n+                return;\n+\n+        Client client = getClient();\n+\n+        // For multi-row insert, the insert trigger should not fire.\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 1, 10, 20);\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 1, 20, 40);\n+        client.callProcedure(\"CAPPED3_LIMIT_ROWS_EXEC.insert\", 1, 30, 60);\n+\n+        verifyStmtFails(client,\n+                        \"INSERT INTO CAPPED3_LIMIT_ROWS_EXEC \"\n+                        + \"SELECT purge_me, wage + 1, dept from CAPPED3_LIMIT_ROWS_EXEC WHERE WAGE = 20\",\n+                        \"exceeds table maximum row count 3\");\n+\n+        String selectAll = \"SELECT * FROM CAPPED3_LIMIT_ROWS_EXEC ORDER BY WAGE\";\n+        VoltTable vt = client.callProcedure(\"@AdHoc\", selectAll).getResults()[0];\n+        validateTableOfLongs(vt, new long[][] {{1, 10, 20}, {1, 20, 40}, {1, 30, 60}});\n+\n+        // Upsert fails too.\n+        verifyStmtFails(client,\n+                        \"UPSERT INTO CAPPED3_LIMIT_ROWS_EXEC \"\n+                        + \"SELECT purge_me, wage + 1, dept from CAPPED3_LIMIT_ROWS_EXEC WHERE WAGE = 20 \"\n+                        + \"ORDER BY 1, 2, 3\",\n+                        \"exceeds table maximum row count 3\");\n+        vt = client.callProcedure(\"@AdHoc\", selectAll).getResults()[0];\n+        validateTableOfLongs(vt, new long[][] {{1, 10, 20}, {1, 20, 40}, {1, 30, 60}});\n+    }\n+\n+    public void testTableLimitPartitionRowsExecUpsert() throws Exception {\n+\n+        if (isHSQL())\n+                return;\n+\n+        Client client = getClient();\n+\n+        // For multi-row insert, the insert trigger should not fire.","path":"tests/frontend/org/voltdb/regressionsuites/TestSQLFeaturesNewSuite.java","position":218,"original_position":218,"commit_id":"87803f777ee76c7be97c6e9f341a778daec066a8","original_commit_id":"87803f777ee76c7be97c6e9f341a778daec066a8","user":{"login":"cwolff-voltdb","id":7902964,"avatar_url":"https://avatars.githubusercontent.com/u/7902964?v=2","gravatar_id":"","url":"https://api.github.com/users/cwolff-voltdb","html_url":"https://github.com/cwolff-voltdb","followers_url":"https://api.github.com/users/cwolff-voltdb/followers","following_url":"https://api.github.com/users/cwolff-voltdb/following{/other_user}","gists_url":"https://api.github.com/users/cwolff-voltdb/gists{/gist_id}","starred_url":"https://api.github.com/users/cwolff-voltdb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cwolff-voltdb/subscriptions","organizations_url":"https://api.github.com/users/cwolff-voltdb/orgs","repos_url":"https://api.github.com/users/cwolff-voltdb/repos","events_url":"https://api.github.com/users/cwolff-voltdb/events{/privacy}","received_events_url":"https://api.github.com/users/cwolff-voltdb/received_events","type":"User","site_admin":false},"body":"Yes, multi-row insert and upsert are covered in the test method `testTableLimitPartitionRowsExecMultiRow`.","created_at":"2014-10-28T16:54:41Z","updated_at":"2014-10-28T16:54:41Z","html_url":"https://github.com/VoltDB/voltdb/pull/1732#discussion_r19485105","pull_request_url":"https://api.github.com/repos/VoltDB/voltdb/pulls/1732","_links":{"self":{"href":"https://api.github.com/repos/VoltDB/voltdb/pulls/comments/19485105"},"html":{"href":"https://github.com/VoltDB/voltdb/pull/1732#discussion_r19485105"},"pull_request":{"href":"https://api.github.com/repos/VoltDB/voltdb/pulls/1732"}}},"pull_request":{"url":"https://api.github.com/repos/VoltDB/voltdb/pulls/1732","id":23403765,"html_url":"https://github.com/VoltDB/voltdb/pull/1732","diff_url":"https://github.com/VoltDB/voltdb/pull/1732.diff","patch_url":"https://github.com/VoltDB/voltdb/pull/1732.patch","issue_url":"https://api.github.com/repos/VoltDB/voltdb/issues/1732","number":1732,"state":"open","locked":false,"title":"EE support for LIMIT PARTITION ROWS EXECUTE DELETE...","user":{"login":"cwolff-voltdb","id":7902964,"avatar_url":"https://avatars.githubusercontent.com/u/7902964?v=2","gravatar_id":"","url":"https://api.github.com/users/cwolff-voltdb","html_url":"https://github.com/cwolff-voltdb","followers_url":"https://api.github.com/users/cwolff-voltdb/followers","following_url":"https://api.github.com/users/cwolff-voltdb/following{/other_user}","gists_url":"https://api.github.com/users/cwolff-voltdb/gists{/gist_id}","starred_url":"https://api.github.com/users/cwolff-voltdb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cwolff-voltdb/subscriptions","organizations_url":"https://api.github.com/users/cwolff-voltdb/orgs","repos_url":"https://api.github.com/users/cwolff-voltdb/repos","events_url":"https://api.github.com/users/cwolff-voltdb/events{/privacy}","received_events_url":"https://api.github.com/users/cwolff-voltdb/received_events","type":"User","site_admin":false},"body":"Adds a couple new methods to `PersistentTable`: `hasPurgeFragment` and `getPurgeFragmentId`.  The insert executor will request the `VoltDBEngine` to execute the purge fragment if the table is at its row limit.\r\n\r\nMy current thinking is that the purge fragment for a table should be cached like any other fragment.  The purge fragment might be executed often, or very infrequently, so our LRU caches seem well-suited to this.  This approach also minimizes changes in the back end, as well as changes to catalog.  (Currently we represent expression trees in the catalog, but there is no precedent for a complete fragment.)\r\n\r\nIt's still unclear to me how we might handle the problem of mapping a table to its purge fragment id, especially since the purge fragment id might change when it's removed and then re-cached.\r\n\r\n","created_at":"2014-10-27T18:13:00Z","updated_at":"2014-10-28T16:54:41Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8ea8b8334595da630bcd1a4c54695a7476b84ebb","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/VoltDB/voltdb/pulls/1732/commits","review_comments_url":"https://api.github.com/repos/VoltDB/voltdb/pulls/1732/comments","review_comment_url":"https://api.github.com/repos/VoltDB/voltdb/pulls/comments/{number}","comments_url":"https://api.github.com/repos/VoltDB/voltdb/issues/1732/comments","statuses_url":"https://api.github.com/repos/VoltDB/voltdb/statuses/87803f777ee76c7be97c6e9f341a778daec066a8","head":{"label":"VoltDB:ENG-7018-limit-rows-execute-ee","ref":"ENG-7018-limit-rows-execute-ee","sha":"87803f777ee76c7be97c6e9f341a778daec066a8","user":{"login":"VoltDB","id":703910,"avatar_url":"https://avatars.githubusercontent.com/u/703910?v=2","gravatar_id":"","url":"https://api.github.com/users/VoltDB","html_url":"https://github.com/VoltDB","followers_url":"https://api.github.com/users/VoltDB/followers","following_url":"https://api.github.com/users/VoltDB/following{/other_user}","gists_url":"https://api.github.com/users/VoltDB/gists{/gist_id}","starred_url":"https://api.github.com/users/VoltDB/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/VoltDB/subscriptions","organizations_url":"https://api.github.com/users/VoltDB/orgs","repos_url":"https://api.github.com/users/VoltDB/repos","events_url":"https://api.github.com/users/VoltDB/events{/privacy}","received_events_url":"https://api.github.com/users/VoltDB/received_events","type":"Organization","site_admin":false},"repo":{"id":2445970,"name":"voltdb","full_name":"VoltDB/voltdb","owner":{"login":"VoltDB","id":703910,"avatar_url":"https://avatars.githubusercontent.com/u/703910?v=2","gravatar_id":"","url":"https://api.github.com/users/VoltDB","html_url":"https://github.com/VoltDB","followers_url":"https://api.github.com/users/VoltDB/followers","following_url":"https://api.github.com/users/VoltDB/following{/other_user}","gists_url":"https://api.github.com/users/VoltDB/gists{/gist_id}","starred_url":"https://api.github.com/users/VoltDB/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/VoltDB/subscriptions","organizations_url":"https://api.github.com/users/VoltDB/orgs","repos_url":"https://api.github.com/users/VoltDB/repos","events_url":"https://api.github.com/users/VoltDB/events{/privacy}","received_events_url":"https://api.github.com/users/VoltDB/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/VoltDB/voltdb","description":"VoltDB","fork":false,"url":"https://api.github.com/repos/VoltDB/voltdb","forks_url":"https://api.github.com/repos/VoltDB/voltdb/forks","keys_url":"https://api.github.com/repos/VoltDB/voltdb/keys{/key_id}","collaborators_url":"https://api.github.com/repos/VoltDB/voltdb/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/VoltDB/voltdb/teams","hooks_url":"https://api.github.com/repos/VoltDB/voltdb/hooks","issue_events_url":"https://api.github.com/repos/VoltDB/voltdb/issues/events{/number}","events_url":"https://api.github.com/repos/VoltDB/voltdb/events","assignees_url":"https://api.github.com/repos/VoltDB/voltdb/assignees{/user}","branches_url":"https://api.github.com/repos/VoltDB/voltdb/branches{/branch}","tags_url":"https://api.github.com/repos/VoltDB/voltdb/tags","blobs_url":"https://api.github.com/repos/VoltDB/voltdb/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/VoltDB/voltdb/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/VoltDB/voltdb/git/refs{/sha}","trees_url":"https://api.github.com/repos/VoltDB/voltdb/git/trees{/sha}","statuses_url":"https://api.github.com/repos/VoltDB/voltdb/statuses/{sha}","languages_url":"https://api.github.com/repos/VoltDB/voltdb/languages","stargazers_url":"https://api.github.com/repos/VoltDB/voltdb/stargazers","contributors_url":"https://api.github.com/repos/VoltDB/voltdb/contributors","subscribers_url":"https://api.github.com/repos/VoltDB/voltdb/subscribers","subscription_url":"https://api.github.com/repos/VoltDB/voltdb/subscription","commits_url":"https://api.github.com/repos/VoltDB/voltdb/commits{/sha}","git_commits_url":"https://api.github.com/repos/VoltDB/voltdb/git/commits{/sha}","comments_url":"https://api.github.com/repos/VoltDB/voltdb/comments{/number}","issue_comment_url":"https://api.github.com/repos/VoltDB/voltdb/issues/comments/{number}","contents_url":"https://api.github.com/repos/VoltDB/voltdb/contents/{+path}","compare_url":"https://api.github.com/repos/VoltDB/voltdb/compare/{base}...{head}","merges_url":"https://api.github.com/repos/VoltDB/voltdb/merges","archive_url":"https://api.github.com/repos/VoltDB/voltdb/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/VoltDB/voltdb/downloads","issues_url":"https://api.github.com/repos/VoltDB/voltdb/issues{/number}","pulls_url":"https://api.github.com/repos/VoltDB/voltdb/pulls{/number}","milestones_url":"https://api.github.com/repos/VoltDB/voltdb/milestones{/number}","notifications_url":"https://api.github.com/repos/VoltDB/voltdb/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/VoltDB/voltdb/labels{/name}","releases_url":"https://api.github.com/repos/VoltDB/voltdb/releases{/id}","created_at":"2011-09-23T18:46:12Z","updated_at":"2014-10-28T02:12:12Z","pushed_at":"2014-10-28T15:31:07Z","git_url":"git://github.com/VoltDB/voltdb.git","ssh_url":"git@github.com:VoltDB/voltdb.git","clone_url":"https://github.com/VoltDB/voltdb.git","svn_url":"https://github.com/VoltDB/voltdb","homepage":"http://community.voltdb.com/","size":525145,"stargazers_count":382,"watchers_count":382,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":110,"mirror_url":null,"open_issues_count":16,"forks":110,"open_issues":16,"watchers":382,"default_branch":"master"}},"base":{"label":"VoltDB:master","ref":"master","sha":"f6471311acd1300a0ce32234bb6da4fff6bb8a42","user":{"login":"VoltDB","id":703910,"avatar_url":"https://avatars.githubusercontent.com/u/703910?v=2","gravatar_id":"","url":"https://api.github.com/users/VoltDB","html_url":"https://github.com/VoltDB","followers_url":"https://api.github.com/users/VoltDB/followers","following_url":"https://api.github.com/users/VoltDB/following{/other_user}","gists_url":"https://api.github.com/users/VoltDB/gists{/gist_id}","starred_url":"https://api.github.com/users/VoltDB/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/VoltDB/subscriptions","organizations_url":"https://api.github.com/users/VoltDB/orgs","repos_url":"https://api.github.com/users/VoltDB/repos","events_url":"https://api.github.com/users/VoltDB/events{/privacy}","received_events_url":"https://api.github.com/users/VoltDB/received_events","type":"Organization","site_admin":false},"repo":{"id":2445970,"name":"voltdb","full_name":"VoltDB/voltdb","owner":{"login":"VoltDB","id":703910,"avatar_url":"https://avatars.githubusercontent.com/u/703910?v=2","gravatar_id":"","url":"https://api.github.com/users/VoltDB","html_url":"https://github.com/VoltDB","followers_url":"https://api.github.com/users/VoltDB/followers","following_url":"https://api.github.com/users/VoltDB/following{/other_user}","gists_url":"https://api.github.com/users/VoltDB/gists{/gist_id}","starred_url":"https://api.github.com/users/VoltDB/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/VoltDB/subscriptions","organizations_url":"https://api.github.com/users/VoltDB/orgs","repos_url":"https://api.github.com/users/VoltDB/repos","events_url":"https://api.github.com/users/VoltDB/events{/privacy}","received_events_url":"https://api.github.com/users/VoltDB/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/VoltDB/voltdb","description":"VoltDB","fork":false,"url":"https://api.github.com/repos/VoltDB/voltdb","forks_url":"https://api.github.com/repos/VoltDB/voltdb/forks","keys_url":"https://api.github.com/repos/VoltDB/voltdb/keys{/key_id}","collaborators_url":"https://api.github.com/repos/VoltDB/voltdb/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/VoltDB/voltdb/teams","hooks_url":"https://api.github.com/repos/VoltDB/voltdb/hooks","issue_events_url":"https://api.github.com/repos/VoltDB/voltdb/issues/events{/number}","events_url":"https://api.github.com/repos/VoltDB/voltdb/events","assignees_url":"https://api.github.com/repos/VoltDB/voltdb/assignees{/user}","branches_url":"https://api.github.com/repos/VoltDB/voltdb/branches{/branch}","tags_url":"https://api.github.com/repos/VoltDB/voltdb/tags","blobs_url":"https://api.github.com/repos/VoltDB/voltdb/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/VoltDB/voltdb/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/VoltDB/voltdb/git/refs{/sha}","trees_url":"https://api.github.com/repos/VoltDB/voltdb/git/trees{/sha}","statuses_url":"https://api.github.com/repos/VoltDB/voltdb/statuses/{sha}","languages_url":"https://api.github.com/repos/VoltDB/voltdb/languages","stargazers_url":"https://api.github.com/repos/VoltDB/voltdb/stargazers","contributors_url":"https://api.github.com/repos/VoltDB/voltdb/contributors","subscribers_url":"https://api.github.com/repos/VoltDB/voltdb/subscribers","subscription_url":"https://api.github.com/repos/VoltDB/voltdb/subscription","commits_url":"https://api.github.com/repos/VoltDB/voltdb/commits{/sha}","git_commits_url":"https://api.github.com/repos/VoltDB/voltdb/git/commits{/sha}","comments_url":"https://api.github.com/repos/VoltDB/voltdb/comments{/number}","issue_comment_url":"https://api.github.com/repos/VoltDB/voltdb/issues/comments/{number}","contents_url":"https://api.github.com/repos/VoltDB/voltdb/contents/{+path}","compare_url":"https://api.github.com/repos/VoltDB/voltdb/compare/{base}...{head}","merges_url":"https://api.github.com/repos/VoltDB/voltdb/merges","archive_url":"https://api.github.com/repos/VoltDB/voltdb/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/VoltDB/voltdb/downloads","issues_url":"https://api.github.com/repos/VoltDB/voltdb/issues{/number}","pulls_url":"https://api.github.com/repos/VoltDB/voltdb/pulls{/number}","milestones_url":"https://api.github.com/repos/VoltDB/voltdb/milestones{/number}","notifications_url":"https://api.github.com/repos/VoltDB/voltdb/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/VoltDB/voltdb/labels{/name}","releases_url":"https://api.github.com/repos/VoltDB/voltdb/releases{/id}","created_at":"2011-09-23T18:46:12Z","updated_at":"2014-10-28T02:12:12Z","pushed_at":"2014-10-28T15:31:07Z","git_url":"git://github.com/VoltDB/voltdb.git","ssh_url":"git@github.com:VoltDB/voltdb.git","clone_url":"https://github.com/VoltDB/voltdb.git","svn_url":"https://github.com/VoltDB/voltdb","homepage":"http://community.voltdb.com/","size":525145,"stargazers_count":382,"watchers_count":382,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":110,"mirror_url":null,"open_issues_count":16,"forks":110,"open_issues":16,"watchers":382,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/VoltDB/voltdb/pulls/1732"},"html":{"href":"https://github.com/VoltDB/voltdb/pull/1732"},"issue":{"href":"https://api.github.com/repos/VoltDB/voltdb/issues/1732"},"comments":{"href":"https://api.github.com/repos/VoltDB/voltdb/issues/1732/comments"},"review_comments":{"href":"https://api.github.com/repos/VoltDB/voltdb/pulls/1732/comments"},"review_comment":{"href":"https://api.github.com/repos/VoltDB/voltdb/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/VoltDB/voltdb/pulls/1732/commits"},"statuses":{"href":"https://api.github.com/repos/VoltDB/voltdb/statuses/87803f777ee76c7be97c6e9f341a778daec066a8"}}}}