{"action":"created","comment":{"url":"https://api.github.com/repos/VoltDB/voltdb/pulls/comments/79486364","id":79486364,"diff_hunk":"@@ -594,12 +600,126 @@ public void testUnionOrderByLimitParams() {\n         pn = pn.getChild(0);\n         int[] idxs = {0};\n         checkOrderByNode(pn, columnNames, idxs);\n-        assertTrue(pn.getChild(0) instanceof UnionPlanNode);\n+        assertTrue(pn.getChild(0) instanceof SetOpPlanNode);\n         pn = pn.getInlinePlanNode(PlanNodeType.LIMIT);\n         assert (pn instanceof LimitPlanNode);\n         assertTrue(pn.toExplainPlanString().contains(\"LIMIT with parameter\"));\n     }\n \n+    public void testMultiPartitionedSetOpsPushDown() {\n+      List<AbstractPlanNode> pns;\n+      PlanNodeType[] coordinatorTypes;\n+      PlanNodeType[] setOpChildren;\n+\n+      // Union of two distributed selects\n+      pns = compileToFragments(\"select AT9.A AA from T9 AT9 union select AT10.A A2 from T10 AT10\");\n+      coordinatorTypes = new PlanNodeType[] {PlanNodeType.RECEIVE};\n+      setOpChildren = new PlanNodeType[] {PlanNodeType.INDEXSCAN, PlanNodeType.INDEXSCAN};\n+      checkPushedDownSetOp(pns, coordinatorTypes, SetOpType.UNION, setOpChildren);\n+\n+      // EXCEPT of three distributed selects\n+      pns = compileToFragments(\"select A from T9 except select A from T10 except select A from T1\");\n+      coordinatorTypes = new PlanNodeType[] {PlanNodeType.RECEIVE};\n+      setOpChildren = new PlanNodeType[] {PlanNodeType.INDEXSCAN, PlanNodeType.INDEXSCAN, PlanNodeType.SEQSCAN};\n+      checkPushedDownSetOp(pns, coordinatorTypes, SetOpType.EXCEPT, setOpChildren);\n+\n+      // Missed optimization for Set Ops - Should be MERGERECEIVE since the partitions results are ordered by the primary key A\n+      pns = compileToFragments(\"(select A from T9 where A > 0 order by A) union (select A from T10 where A > 0 order by A) order by A\");\n+      coordinatorTypes = new PlanNodeType[] {PlanNodeType.ORDERBY, PlanNodeType.RECEIVE};\n+      setOpChildren = new PlanNodeType[] {PlanNodeType.INDEXSCAN, PlanNodeType.INDEXSCAN};\n+      checkPushedDownSetOp(pns, coordinatorTypes, SetOpType.UNION, setOpChildren);\n+\n+      // AT9.A AA2 and AT10.A A2 - partitioning column repeated twice\n+      pns = compileToFragments(\"select AT9.A AA1, AT9.A AA2 from T9 AT9 union select AT10.B AB1, AT10.A A2 from T10 AT10\");\n+      coordinatorTypes = new PlanNodeType[] {PlanNodeType.RECEIVE};\n+      setOpChildren = new PlanNodeType[] {PlanNodeType.INDEXSCAN, PlanNodeType.INDEXSCAN};\n+      checkPushedDownSetOp(pns, coordinatorTypes, SetOpType.UNION, setOpChildren);\n+\n+      // Union of two distributed joins - partitioning columns T9.A and T10.A are both in the same positions.\n+      pns = compileToFragments(\"select T9.A, T10.B from T9, T10 where T9.A = T10.A union select T10.A, T10.B from T9, T10 where T9.A = T10.A\");\n+      coordinatorTypes = new PlanNodeType[] {PlanNodeType.RECEIVE};\n+      setOpChildren = new PlanNodeType[] {PlanNodeType.NESTLOOPINDEX, PlanNodeType.NESTLOOPINDEX};\n+      checkPushedDownSetOp(pns, coordinatorTypes, SetOpType.UNION, setOpChildren);\n+\n+      // Multiple set ops with distributed tables\n+      pns = compileToFragments(\"select A from T9 union (select A from T10 except select A from T1)\");\n+      coordinatorTypes = new PlanNodeType[] {PlanNodeType.RECEIVE};\n+      setOpChildren = new PlanNodeType[] {PlanNodeType.INDEXSCAN, PlanNodeType.SETOP};\n+      checkPushedDownSetOp(pns, coordinatorTypes, SetOpType.UNION, setOpChildren);\n+\n+      // The output schema for both children is coming from the inline aggregates\n+      // T1.A and T4.D are partitioning columns\n+      pns = compileToFragments(\"SELECT A, COUNT(*) FROM T1 GROUP BY A UNION SELECT D, COUNT(*) FROM T4 GROUP BY D\");\n+      coordinatorTypes = new PlanNodeType[] {PlanNodeType.RECEIVE};\n+      setOpChildren = new PlanNodeType[] {PlanNodeType.SEQSCAN, PlanNodeType.SEQSCAN};\n+      checkPushedDownSetOp(pns, coordinatorTypes, SetOpType.UNION, setOpChildren);\n+\n+      // union with a distributed matview\n+      pns = compileToFragments(\"SELECT V_A, CNT FROM VT1 UNION SELECT D, COUNT(*) FROM T4 GROUP BY D\");\n+      coordinatorTypes = new PlanNodeType[] {PlanNodeType.RECEIVE};\n+      setOpChildren = new PlanNodeType[] {PlanNodeType.INDEXSCAN, PlanNodeType.SEQSCAN};\n+      checkPushedDownSetOp(pns, coordinatorTypes, SetOpType.UNION, setOpChildren);\n+\n+      // Union with a distributed join\n+      pns = compileToFragments(\"SELECT D FROM T4, T2 WHERE T4.D = T2.B UNION SELECT D FROM T4;\");\n+      coordinatorTypes = new PlanNodeType[] {PlanNodeType.RECEIVE};\n+      setOpChildren = new PlanNodeType[] {PlanNodeType.NESTLOOP, PlanNodeType.SEQSCAN};\n+      checkPushedDownSetOp(pns, coordinatorTypes, SetOpType.UNION, setOpChildren);\n+\n+      // FROM subquery - non-trivial coordinator fragment - SEQSCAN\n+      failToCompile(\"select A, B from (select T9.A, T10.B from T9, T10 where T9.A = T10.A limit 10) T union select A, B from T9\",\n+              \"Statements are too complex in set operation using multiple partitioned tables.\");\n+      // No partioning columns in the output\n+      failToCompile(\"select T1.DESC from T1 union select T5.TEXT from T5\",\n+              \"Statements are too complex in set operation using multiple partitioned tables.\");\n+      failToCompile(\"SELECT F, COUNT(*) FROM T1 GROUP BY F UNION SELECT D, COUNT(*) FROM T4 GROUP BY D\",\n+              \"Statements are too complex in set operation using multiple partitioned tables.\");\n+      failToCompile(\"SELECT COUNT(*) FROM T1 UNION SELECT D FROM T4\",\n+              \"Statements are too complex in set operation using multiple partitioned tables.\");\n+      // Partitioning columns position mismatch\n+      failToCompile(\"SELECT CNT, V_A FROM VT1 UNION SELECT D, COUNT(*) FROM T4 GROUP BY D\",\n+              \"Statements are too complex in set operation using multiple partitioned tables.\");\n+      // Select from distributed T1 does not require a MP plan\n+      failToCompile(\"select T1.A from T1 where T1.A = 3 union select T5.E from T5\",\n+              \"Statements are too complex in set operation using multiple partitioned tables.\");\n+      // Partitioning columns (T9.A and T10.A) position mismatch\n+      failToCompile(\"select T9.A, T9.B from T9 union select T10.B, T10.A from T10\",\n+              \"Statements are too complex in set operation using multiple partitioned tables.\");\n+      // Union of three distributed selects. The output fo the last select doesn't have the partitioning column\n+      failToCompile(\"select A from T9 union select A from T10 union select F from T1\",\n+              \"Statements are too complex in set operation using multiple partitioned tables.\");\n+      // Not all of the selects (T10) have partitioning column in the output\n+      failToCompile(\"select T9.A from T9 union select T10.B from T10\",\n+              \"Statements are too complex in set operation using multiple partitioned tables.\");\n+      // Union of two distributed selects. One of them has a column expression that involved a partitioning column\n+      failToCompile(\"select AT9.A + 1 AA from T9 AT9 union select AT10.A A2 from T10 AT10\",\n+              \"Statements are too complex in set operation using multiple partitioned tables.\");\n+    }","path":"tests/frontend/org/voltdb/planner/TestUnion.java","position":484,"original_position":484,"commit_id":"e3e49916ff688778145c593d268e94d1b3b34223","original_commit_id":"e3e49916ff688778145c593d268e94d1b3b34223","user":{"login":"paulmartel","id":1512099,"avatar_url":"https://avatars.githubusercontent.com/u/1512099?v=3","gravatar_id":"","url":"https://api.github.com/users/paulmartel","html_url":"https://github.com/paulmartel","followers_url":"https://api.github.com/users/paulmartel/followers","following_url":"https://api.github.com/users/paulmartel/following{/other_user}","gists_url":"https://api.github.com/users/paulmartel/gists{/gist_id}","starred_url":"https://api.github.com/users/paulmartel/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paulmartel/subscriptions","organizations_url":"https://api.github.com/users/paulmartel/orgs","repos_url":"https://api.github.com/users/paulmartel/repos","events_url":"https://api.github.com/users/paulmartel/events{/privacy}","received_events_url":"https://api.github.com/users/paulmartel/received_events","type":"User","site_admin":false},"body":"Add negative test cases showing that aliasing of partitioned columns and non-partitioned columns does not interfere, even in the malicious case when two columns' names are swapped.","created_at":"2016-09-19T20:52:21Z","updated_at":"2016-09-19T20:57:27Z","html_url":"https://github.com/VoltDB/voltdb/pull/3908#discussion_r79486364","pull_request_url":"https://api.github.com/repos/VoltDB/voltdb/pulls/3908","_links":{"self":{"href":"https://api.github.com/repos/VoltDB/voltdb/pulls/comments/79486364"},"html":{"href":"https://github.com/VoltDB/voltdb/pull/3908#discussion_r79486364"},"pull_request":{"href":"https://api.github.com/repos/VoltDB/voltdb/pulls/3908"}}},"pull_request":{"url":"https://api.github.com/repos/VoltDB/voltdb/pulls/3908","id":84194034,"html_url":"https://github.com/VoltDB/voltdb/pull/3908","diff_url":"https://github.com/VoltDB/voltdb/pull/3908.diff","patch_url":"https://github.com/VoltDB/voltdb/pull/3908.patch","issue_url":"https://api.github.com/repos/VoltDB/voltdb/issues/3908","number":3908,"state":"open","locked":false,"title":"Eng 10859 partitioned set op","user":{"login":"alexeevm","id":1646199,"avatar_url":"https://avatars.githubusercontent.com/u/1646199?v=3","gravatar_id":"","url":"https://api.github.com/users/alexeevm","html_url":"https://github.com/alexeevm","followers_url":"https://api.github.com/users/alexeevm/followers","following_url":"https://api.github.com/users/alexeevm/following{/other_user}","gists_url":"https://api.github.com/users/alexeevm/gists{/gist_id}","starred_url":"https://api.github.com/users/alexeevm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexeevm/subscriptions","organizations_url":"https://api.github.com/users/alexeevm/orgs","repos_url":"https://api.github.com/users/alexeevm/repos","events_url":"https://api.github.com/users/alexeevm/events{/privacy}","received_events_url":"https://api.github.com/users/alexeevm/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-09-06T20:50:38Z","updated_at":"2016-09-19T20:57:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"23205b1e977811ccd66170d9b77ef184321faba9","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/VoltDB/voltdb/pulls/3908/commits","review_comments_url":"https://api.github.com/repos/VoltDB/voltdb/pulls/3908/comments","review_comment_url":"https://api.github.com/repos/VoltDB/voltdb/pulls/comments{/number}","comments_url":"https://api.github.com/repos/VoltDB/voltdb/issues/3908/comments","statuses_url":"https://api.github.com/repos/VoltDB/voltdb/statuses/e3e49916ff688778145c593d268e94d1b3b34223","head":{"label":"alexeevm:ENG-10859-partitioned-set-op","ref":"ENG-10859-partitioned-set-op","sha":"e3e49916ff688778145c593d268e94d1b3b34223","user":{"login":"alexeevm","id":1646199,"avatar_url":"https://avatars.githubusercontent.com/u/1646199?v=3","gravatar_id":"","url":"https://api.github.com/users/alexeevm","html_url":"https://github.com/alexeevm","followers_url":"https://api.github.com/users/alexeevm/followers","following_url":"https://api.github.com/users/alexeevm/following{/other_user}","gists_url":"https://api.github.com/users/alexeevm/gists{/gist_id}","starred_url":"https://api.github.com/users/alexeevm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexeevm/subscriptions","organizations_url":"https://api.github.com/users/alexeevm/orgs","repos_url":"https://api.github.com/users/alexeevm/repos","events_url":"https://api.github.com/users/alexeevm/events{/privacy}","received_events_url":"https://api.github.com/users/alexeevm/received_events","type":"User","site_admin":false},"repo":{"id":4035225,"name":"voltdb","full_name":"alexeevm/voltdb","owner":{"login":"alexeevm","id":1646199,"avatar_url":"https://avatars.githubusercontent.com/u/1646199?v=3","gravatar_id":"","url":"https://api.github.com/users/alexeevm","html_url":"https://github.com/alexeevm","followers_url":"https://api.github.com/users/alexeevm/followers","following_url":"https://api.github.com/users/alexeevm/following{/other_user}","gists_url":"https://api.github.com/users/alexeevm/gists{/gist_id}","starred_url":"https://api.github.com/users/alexeevm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alexeevm/subscriptions","organizations_url":"https://api.github.com/users/alexeevm/orgs","repos_url":"https://api.github.com/users/alexeevm/repos","events_url":"https://api.github.com/users/alexeevm/events{/privacy}","received_events_url":"https://api.github.com/users/alexeevm/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/alexeevm/voltdb","description":"VoltDB","fork":true,"url":"https://api.github.com/repos/alexeevm/voltdb","forks_url":"https://api.github.com/repos/alexeevm/voltdb/forks","keys_url":"https://api.github.com/repos/alexeevm/voltdb/keys{/key_id}","collaborators_url":"https://api.github.com/repos/alexeevm/voltdb/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/alexeevm/voltdb/teams","hooks_url":"https://api.github.com/repos/alexeevm/voltdb/hooks","issue_events_url":"https://api.github.com/repos/alexeevm/voltdb/issues/events{/number}","events_url":"https://api.github.com/repos/alexeevm/voltdb/events","assignees_url":"https://api.github.com/repos/alexeevm/voltdb/assignees{/user}","branches_url":"https://api.github.com/repos/alexeevm/voltdb/branches{/branch}","tags_url":"https://api.github.com/repos/alexeevm/voltdb/tags","blobs_url":"https://api.github.com/repos/alexeevm/voltdb/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/alexeevm/voltdb/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/alexeevm/voltdb/git/refs{/sha}","trees_url":"https://api.github.com/repos/alexeevm/voltdb/git/trees{/sha}","statuses_url":"https://api.github.com/repos/alexeevm/voltdb/statuses/{sha}","languages_url":"https://api.github.com/repos/alexeevm/voltdb/languages","stargazers_url":"https://api.github.com/repos/alexeevm/voltdb/stargazers","contributors_url":"https://api.github.com/repos/alexeevm/voltdb/contributors","subscribers_url":"https://api.github.com/repos/alexeevm/voltdb/subscribers","subscription_url":"https://api.github.com/repos/alexeevm/voltdb/subscription","commits_url":"https://api.github.com/repos/alexeevm/voltdb/commits{/sha}","git_commits_url":"https://api.github.com/repos/alexeevm/voltdb/git/commits{/sha}","comments_url":"https://api.github.com/repos/alexeevm/voltdb/comments{/number}","issue_comment_url":"https://api.github.com/repos/alexeevm/voltdb/issues/comments{/number}","contents_url":"https://api.github.com/repos/alexeevm/voltdb/contents/{+path}","compare_url":"https://api.github.com/repos/alexeevm/voltdb/compare/{base}...{head}","merges_url":"https://api.github.com/repos/alexeevm/voltdb/merges","archive_url":"https://api.github.com/repos/alexeevm/voltdb/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/alexeevm/voltdb/downloads","issues_url":"https://api.github.com/repos/alexeevm/voltdb/issues{/number}","pulls_url":"https://api.github.com/repos/alexeevm/voltdb/pulls{/number}","milestones_url":"https://api.github.com/repos/alexeevm/voltdb/milestones{/number}","notifications_url":"https://api.github.com/repos/alexeevm/voltdb/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/alexeevm/voltdb/labels{/name}","releases_url":"https://api.github.com/repos/alexeevm/voltdb/releases{/id}","deployments_url":"https://api.github.com/repos/alexeevm/voltdb/deployments","created_at":"2012-04-15T21:29:40Z","updated_at":"2015-04-30T01:37:44Z","pushed_at":"2016-09-07T02:25:08Z","git_url":"git://github.com/alexeevm/voltdb.git","ssh_url":"git@github.com:alexeevm/voltdb.git","clone_url":"https://github.com/alexeevm/voltdb.git","svn_url":"https://github.com/alexeevm/voltdb","homepage":"http://community.voltdb.com/","size":345576,"stargazers_count":2,"watchers_count":2,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":3,"forks":0,"open_issues":3,"watchers":2,"default_branch":"master"}},"base":{"label":"VoltDB:master","ref":"master","sha":"e4fb89ce05523564cc69cf160468728876387a6e","user":{"login":"VoltDB","id":703910,"avatar_url":"https://avatars.githubusercontent.com/u/703910?v=3","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=3","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}","deployments_url":"https://api.github.com/repos/VoltDB/voltdb/deployments","created_at":"2011-09-23T18:46:12Z","updated_at":"2016-09-19T18:23:01Z","pushed_at":"2016-09-19T20:29:38Z","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":618960,"stargazers_count":862,"watchers_count":862,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":265,"mirror_url":null,"open_issues_count":57,"forks":265,"open_issues":57,"watchers":862,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/VoltDB/voltdb/pulls/3908"},"html":{"href":"https://github.com/VoltDB/voltdb/pull/3908"},"issue":{"href":"https://api.github.com/repos/VoltDB/voltdb/issues/3908"},"comments":{"href":"https://api.github.com/repos/VoltDB/voltdb/issues/3908/comments"},"review_comments":{"href":"https://api.github.com/repos/VoltDB/voltdb/pulls/3908/comments"},"review_comment":{"href":"https://api.github.com/repos/VoltDB/voltdb/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/VoltDB/voltdb/pulls/3908/commits"},"statuses":{"href":"https://api.github.com/repos/VoltDB/voltdb/statuses/e3e49916ff688778145c593d268e94d1b3b34223"}}}}
{"actor":{"display_login":"paulmartel"}}