{"action":"created","comment":{"url":"https://api.github.com/repos/prestodb/presto/pulls/comments/216310934","pull_request_review_id":153760208,"id":216310934,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxNjMxMDkzNA==","diff_hunk":"@@ -0,0 +1,50 @@\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.facebook.presto.plugin.geospatial;\n+\n+import com.facebook.presto.spi.block.BlockBuilder;\n+import com.facebook.presto.spi.function.AggregationFunction;\n+import com.facebook.presto.spi.function.CombineFunction;\n+import com.facebook.presto.spi.function.InputFunction;\n+import com.facebook.presto.spi.function.OutputFunction;\n+import com.facebook.presto.spi.function.SqlType;\n+import com.facebook.presto.spi.type.StandardTypes;\n+import io.airlift.slice.Slice;\n+\n+import static com.facebook.presto.plugin.geospatial.GeometryType.GEOMETRY_TYPE_NAME;\n+import static com.facebook.presto.spi.type.StandardTypes.DOUBLE;\n+\n+@AggregationFunction(value = \"spatial_partitioning\", isOrderSensitive = true)","path":"presto-geospatial/src/main/java/com/facebook/presto/plugin/geospatial/SpatialPartitioningAggregateFunction.java","position":28,"original_position":28,"commit_id":"9e3a4c20663800b4e5f881747c4a35f53367e9a1","original_commit_id":"d0c550ddcb4a1c2ddb2861f7e0b3e675f66b801f","user":{"login":"mbasmanova","id":27965151,"node_id":"MDQ6VXNlcjI3OTY1MTUx","avatar_url":"https://avatars3.githubusercontent.com/u/27965151?v=4","gravatar_id":"","url":"https://api.github.com/users/mbasmanova","html_url":"https://github.com/mbasmanova","followers_url":"https://api.github.com/users/mbasmanova/followers","following_url":"https://api.github.com/users/mbasmanova/following{/other_user}","gists_url":"https://api.github.com/users/mbasmanova/gists{/gist_id}","starred_url":"https://api.github.com/users/mbasmanova/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbasmanova/subscriptions","organizations_url":"https://api.github.com/users/mbasmanova/orgs","repos_url":"https://api.github.com/users/mbasmanova/repos","events_url":"https://api.github.com/users/mbasmanova/events{/privacy}","received_events_url":"https://api.github.com/users/mbasmanova/received_events","type":"User","site_admin":false},"body":"@arhimondr This function samples its input, hence, the results are non-deterministic.","created_at":"2018-09-10T12:59:43Z","updated_at":"2018-09-10T12:59:43Z","html_url":"https://github.com/prestodb/presto/pull/11072#discussion_r216310934","pull_request_url":"https://api.github.com/repos/prestodb/presto/pulls/11072","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/prestodb/presto/pulls/comments/216310934"},"html":{"href":"https://github.com/prestodb/presto/pull/11072#discussion_r216310934"},"pull_request":{"href":"https://api.github.com/repos/prestodb/presto/pulls/11072"}},"in_reply_to_id":213366049},"pull_request":{"url":"https://api.github.com/repos/prestodb/presto/pulls/11072","id":202254881,"node_id":"MDExOlB1bGxSZXF1ZXN0MjAyMjU0ODgx","html_url":"https://github.com/prestodb/presto/pull/11072","diff_url":"https://github.com/prestodb/presto/pull/11072.diff","patch_url":"https://github.com/prestodb/presto/pull/11072.patch","issue_url":"https://api.github.com/repos/prestodb/presto/issues/11072","number":11072,"state":"open","locked":false,"title":"Distributed spatial join","user":{"login":"mbasmanova","id":27965151,"node_id":"MDQ6VXNlcjI3OTY1MTUx","avatar_url":"https://avatars3.githubusercontent.com/u/27965151?v=4","gravatar_id":"","url":"https://api.github.com/users/mbasmanova","html_url":"https://github.com/mbasmanova","followers_url":"https://api.github.com/users/mbasmanova/followers","following_url":"https://api.github.com/users/mbasmanova/following{/other_user}","gists_url":"https://api.github.com/users/mbasmanova/gists{/gist_id}","starred_url":"https://api.github.com/users/mbasmanova/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbasmanova/subscriptions","organizations_url":"https://api.github.com/users/mbasmanova/orgs","repos_url":"https://api.github.com/users/mbasmanova/repos","events_url":"https://api.github.com/users/mbasmanova/events{/privacy}","received_events_url":"https://api.github.com/users/mbasmanova/received_events","type":"User","site_admin":false},"body":"Distributed spatial join uses spatial partitioning scheme based on a K-D-B-tree https://en.wikipedia.org/wiki/K-D-B-tree to partition both sides of the join, then processes individual pairs of partitions using R-Tree formed from the geometries in the build partition.\r\n\r\nK-D-B-tree describing the partitioning scheme is provided by the user via `spatial_partitioning_table_name` session property. The value is the name of the table having one row and one column storing the JSON representation of the K-D-B-tree. The name of the column doesn't matter. To create such a table, run a query: \r\n\r\n`CREATE TABLE p AS SELECT spatial_partitioning(ST_GeometryFromText(wkt), 0.1) as v FROM t`\r\n\r\n`spatial_partitioning` is a new aggregate function that takes a geometry and a sampling percentage, builds a KDB tree and returns its JSON representation as a string. The above query will compute minimum bounding box containing all of the geometries and partition it into non-overlapping rectangles using 0.1% sample of the data. For each partition, the number of geometries overlapping partition rectangle will be roughly the same.\r\n\r\nThe presence of the `spatial_partitioning_table_name` session property turns a broadcast spatial join into distributed spatial join. Distributed join is available for inner joins using ST_Contains, ST_Intersects or ST_Distance functions to define join condition.\r\n\r\n```\r\nCREATE TABLE t_partitioning AS \r\nSELECT spatial_partitioning(ST_Point(t.longitude, t.latitude), 0.1) as v FROM t;\r\n\r\nSET SESSION spatial_partitioning_table_name = 't_partitioning';\r\n\r\nSELECT * \r\nFROM t, u\r\nWHERE ST_Contains(ST_GeometryFromText(u.wkt), ST_Point(t.longitude, t.latitude))\r\n```\r\n\r\n`TransformSpatialPredicates` optimizer rule reads KDB tree from the table specified in `spatial_partitioning_table_name` session property and plans the distributed spatial join.\r\n\r\n```\r\n- filter (ST_Contains(a, b)) \r\n   - cross-join \r\n      - probe\r\n      - build\r\n```\r\n\r\nbecomes\r\n\r\n```\r\n- spatial_join(ST_Contains(a, b))\r\n  - unnest(pids)\r\n     - project(pids := spatial_partitions(kdbTree, a))\r\n        - probe\r\n  - unnest(pids)\r\n     - project(pids := spatial_partitions(kdbTree, b))\r\n         - build\r\n```\r\n\r\nand \r\n\r\n```\r\n- filter (ST_Distance(a, b) <= r) \r\n   - cross-join \r\n      - probe\r\n      - build\r\n```\r\n\r\nbecomes\r\n\r\n```\r\n- spatial_join(ST_Distance(a, b) <= r)\r\n  - unnest(pids)\r\n     - project(pids := spatial_partitions(kdbTree, a))\r\n        - probe\r\n  - unnest(pids)\r\n     - project(pids := spatial_partitions(kdbTree, b, r))\r\n        - build\r\n```\r\n\r\n<img width=\"914\" alt=\"screen shot 2018-08-09 at 1 15 20 pm\" src=\"https://user-images.githubusercontent.com/27965151/43914606-51a9a904-9bd6-11e8-8050-9ef0030bd24b.png\">\r\n\r\nSince the number of spatial partitions may not match the number of nodes available for the join stage, `AddExchanges` adds hash-based exchanges over partition ID columns. Therefore, a single node may process multiple spatial partitions.\r\n\r\nUnlike hash partitioning, spatial partitioning may place a single row into multiple partitions (e.g. a polygon may intersect multiple partitions) and cause multiple nodes to produce identical pairs of matching geometries. To avoid duplicate results, the spatial join operator uses inline deduplication technique. It works as follows:\r\n\r\n- on each node, a join operator figures a set of spatial partitions it is processing using task ID and a mapping between all spatial partition IDs and corresponding extents: `task_id = hash(spatial_partition_id) % total_tasks`\r\n- when considering a potential match (e.g. a pair of geometries with intersecting bounding boxes), the join operator runs a sequence of checks:\r\n  - check if `probe.spatial_partition_id == build.spatial_partition_id` and skip the match if not;\r\n  - if neither probe nor build geometry is a point, compute the intersection of the bounding boxes and check whether the reference point of that intersection belongs to the spatial partition; the reference point is defined as lower left corner (it can be anything, but must be consistent across all join operators and must belong to the intersection); if the reference point located outside of the spatial partition, skip the potential match; \r\n\r\nThis technique relies on (1) non-overlapping spatial partitions (provided by the K-D-B-tree) and (2) containment check that considers partition extent as a rectangle open on the right and upper sides (e.g. any given point belongs to only one partition).\r\n\r\nThis change is part of #9834","created_at":"2018-07-18T13:33:33Z","updated_at":"2018-09-10T12:59:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"556fa3f2325355f39bc3c053036cd744fb5fdfe6","assignee":null,"assignees":[],"requested_reviewers":[{"login":"martint","id":14387,"node_id":"MDQ6VXNlcjE0Mzg3","avatar_url":"https://avatars3.githubusercontent.com/u/14387?v=4","gravatar_id":"","url":"https://api.github.com/users/martint","html_url":"https://github.com/martint","followers_url":"https://api.github.com/users/martint/followers","following_url":"https://api.github.com/users/martint/following{/other_user}","gists_url":"https://api.github.com/users/martint/gists{/gist_id}","starred_url":"https://api.github.com/users/martint/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/martint/subscriptions","organizations_url":"https://api.github.com/users/martint/orgs","repos_url":"https://api.github.com/users/martint/repos","events_url":"https://api.github.com/users/martint/events{/privacy}","received_events_url":"https://api.github.com/users/martint/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":196992743,"node_id":"MDU6TGFiZWwxOTY5OTI3NDM=","url":"https://api.github.com/repos/prestodb/presto/labels/CLA%20Signed","name":"CLA Signed","color":"ededed","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/prestodb/presto/pulls/11072/commits","review_comments_url":"https://api.github.com/repos/prestodb/presto/pulls/11072/comments","review_comment_url":"https://api.github.com/repos/prestodb/presto/pulls/comments{/number}","comments_url":"https://api.github.com/repos/prestodb/presto/issues/11072/comments","statuses_url":"https://api.github.com/repos/prestodb/presto/statuses/9e3a4c20663800b4e5f881747c4a35f53367e9a1","head":{"label":"mbasmanova:distributed-spatial-join-v2","ref":"distributed-spatial-join-v2","sha":"9e3a4c20663800b4e5f881747c4a35f53367e9a1","user":{"login":"mbasmanova","id":27965151,"node_id":"MDQ6VXNlcjI3OTY1MTUx","avatar_url":"https://avatars3.githubusercontent.com/u/27965151?v=4","gravatar_id":"","url":"https://api.github.com/users/mbasmanova","html_url":"https://github.com/mbasmanova","followers_url":"https://api.github.com/users/mbasmanova/followers","following_url":"https://api.github.com/users/mbasmanova/following{/other_user}","gists_url":"https://api.github.com/users/mbasmanova/gists{/gist_id}","starred_url":"https://api.github.com/users/mbasmanova/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbasmanova/subscriptions","organizations_url":"https://api.github.com/users/mbasmanova/orgs","repos_url":"https://api.github.com/users/mbasmanova/repos","events_url":"https://api.github.com/users/mbasmanova/events{/privacy}","received_events_url":"https://api.github.com/users/mbasmanova/received_events","type":"User","site_admin":false},"repo":{"id":100315926,"node_id":"MDEwOlJlcG9zaXRvcnkxMDAzMTU5MjY=","name":"presto","full_name":"mbasmanova/presto","owner":{"login":"mbasmanova","id":27965151,"node_id":"MDQ6VXNlcjI3OTY1MTUx","avatar_url":"https://avatars3.githubusercontent.com/u/27965151?v=4","gravatar_id":"","url":"https://api.github.com/users/mbasmanova","html_url":"https://github.com/mbasmanova","followers_url":"https://api.github.com/users/mbasmanova/followers","following_url":"https://api.github.com/users/mbasmanova/following{/other_user}","gists_url":"https://api.github.com/users/mbasmanova/gists{/gist_id}","starred_url":"https://api.github.com/users/mbasmanova/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbasmanova/subscriptions","organizations_url":"https://api.github.com/users/mbasmanova/orgs","repos_url":"https://api.github.com/users/mbasmanova/repos","events_url":"https://api.github.com/users/mbasmanova/events{/privacy}","received_events_url":"https://api.github.com/users/mbasmanova/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mbasmanova/presto","description":"Distributed SQL query engine for big data","fork":true,"url":"https://api.github.com/repos/mbasmanova/presto","forks_url":"https://api.github.com/repos/mbasmanova/presto/forks","keys_url":"https://api.github.com/repos/mbasmanova/presto/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mbasmanova/presto/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mbasmanova/presto/teams","hooks_url":"https://api.github.com/repos/mbasmanova/presto/hooks","issue_events_url":"https://api.github.com/repos/mbasmanova/presto/issues/events{/number}","events_url":"https://api.github.com/repos/mbasmanova/presto/events","assignees_url":"https://api.github.com/repos/mbasmanova/presto/assignees{/user}","branches_url":"https://api.github.com/repos/mbasmanova/presto/branches{/branch}","tags_url":"https://api.github.com/repos/mbasmanova/presto/tags","blobs_url":"https://api.github.com/repos/mbasmanova/presto/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mbasmanova/presto/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mbasmanova/presto/git/refs{/sha}","trees_url":"https://api.github.com/repos/mbasmanova/presto/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mbasmanova/presto/statuses/{sha}","languages_url":"https://api.github.com/repos/mbasmanova/presto/languages","stargazers_url":"https://api.github.com/repos/mbasmanova/presto/stargazers","contributors_url":"https://api.github.com/repos/mbasmanova/presto/contributors","subscribers_url":"https://api.github.com/repos/mbasmanova/presto/subscribers","subscription_url":"https://api.github.com/repos/mbasmanova/presto/subscription","commits_url":"https://api.github.com/repos/mbasmanova/presto/commits{/sha}","git_commits_url":"https://api.github.com/repos/mbasmanova/presto/git/commits{/sha}","comments_url":"https://api.github.com/repos/mbasmanova/presto/comments{/number}","issue_comment_url":"https://api.github.com/repos/mbasmanova/presto/issues/comments{/number}","contents_url":"https://api.github.com/repos/mbasmanova/presto/contents/{+path}","compare_url":"https://api.github.com/repos/mbasmanova/presto/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mbasmanova/presto/merges","archive_url":"https://api.github.com/repos/mbasmanova/presto/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mbasmanova/presto/downloads","issues_url":"https://api.github.com/repos/mbasmanova/presto/issues{/number}","pulls_url":"https://api.github.com/repos/mbasmanova/presto/pulls{/number}","milestones_url":"https://api.github.com/repos/mbasmanova/presto/milestones{/number}","notifications_url":"https://api.github.com/repos/mbasmanova/presto/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mbasmanova/presto/labels{/name}","releases_url":"https://api.github.com/repos/mbasmanova/presto/releases{/id}","deployments_url":"https://api.github.com/repos/mbasmanova/presto/deployments","created_at":"2017-08-14T22:58:12Z","updated_at":"2018-09-10T12:57:18Z","pushed_at":"2018-09-10T12:57:16Z","git_url":"git://github.com/mbasmanova/presto.git","ssh_url":"git@github.com:mbasmanova/presto.git","clone_url":"https://github.com/mbasmanova/presto.git","svn_url":"https://github.com/mbasmanova/presto","homepage":"https://prestodb.io","size":98102,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"prestodb:master","ref":"master","sha":"2ed1080bab04f04866e9f0a13526384ef8de7c29","user":{"login":"prestodb","id":6882181,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4ODIxODE=","avatar_url":"https://avatars0.githubusercontent.com/u/6882181?v=4","gravatar_id":"","url":"https://api.github.com/users/prestodb","html_url":"https://github.com/prestodb","followers_url":"https://api.github.com/users/prestodb/followers","following_url":"https://api.github.com/users/prestodb/following{/other_user}","gists_url":"https://api.github.com/users/prestodb/gists{/gist_id}","starred_url":"https://api.github.com/users/prestodb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prestodb/subscriptions","organizations_url":"https://api.github.com/users/prestodb/orgs","repos_url":"https://api.github.com/users/prestodb/repos","events_url":"https://api.github.com/users/prestodb/events{/privacy}","received_events_url":"https://api.github.com/users/prestodb/received_events","type":"Organization","site_admin":false},"repo":{"id":5349565,"node_id":"MDEwOlJlcG9zaXRvcnk1MzQ5NTY1","name":"presto","full_name":"prestodb/presto","owner":{"login":"prestodb","id":6882181,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4ODIxODE=","avatar_url":"https://avatars0.githubusercontent.com/u/6882181?v=4","gravatar_id":"","url":"https://api.github.com/users/prestodb","html_url":"https://github.com/prestodb","followers_url":"https://api.github.com/users/prestodb/followers","following_url":"https://api.github.com/users/prestodb/following{/other_user}","gists_url":"https://api.github.com/users/prestodb/gists{/gist_id}","starred_url":"https://api.github.com/users/prestodb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prestodb/subscriptions","organizations_url":"https://api.github.com/users/prestodb/orgs","repos_url":"https://api.github.com/users/prestodb/repos","events_url":"https://api.github.com/users/prestodb/events{/privacy}","received_events_url":"https://api.github.com/users/prestodb/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/prestodb/presto","description":"Distributed SQL query engine for big data","fork":false,"url":"https://api.github.com/repos/prestodb/presto","forks_url":"https://api.github.com/repos/prestodb/presto/forks","keys_url":"https://api.github.com/repos/prestodb/presto/keys{/key_id}","collaborators_url":"https://api.github.com/repos/prestodb/presto/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/prestodb/presto/teams","hooks_url":"https://api.github.com/repos/prestodb/presto/hooks","issue_events_url":"https://api.github.com/repos/prestodb/presto/issues/events{/number}","events_url":"https://api.github.com/repos/prestodb/presto/events","assignees_url":"https://api.github.com/repos/prestodb/presto/assignees{/user}","branches_url":"https://api.github.com/repos/prestodb/presto/branches{/branch}","tags_url":"https://api.github.com/repos/prestodb/presto/tags","blobs_url":"https://api.github.com/repos/prestodb/presto/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/prestodb/presto/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/prestodb/presto/git/refs{/sha}","trees_url":"https://api.github.com/repos/prestodb/presto/git/trees{/sha}","statuses_url":"https://api.github.com/repos/prestodb/presto/statuses/{sha}","languages_url":"https://api.github.com/repos/prestodb/presto/languages","stargazers_url":"https://api.github.com/repos/prestodb/presto/stargazers","contributors_url":"https://api.github.com/repos/prestodb/presto/contributors","subscribers_url":"https://api.github.com/repos/prestodb/presto/subscribers","subscription_url":"https://api.github.com/repos/prestodb/presto/subscription","commits_url":"https://api.github.com/repos/prestodb/presto/commits{/sha}","git_commits_url":"https://api.github.com/repos/prestodb/presto/git/commits{/sha}","comments_url":"https://api.github.com/repos/prestodb/presto/comments{/number}","issue_comment_url":"https://api.github.com/repos/prestodb/presto/issues/comments{/number}","contents_url":"https://api.github.com/repos/prestodb/presto/contents/{+path}","compare_url":"https://api.github.com/repos/prestodb/presto/compare/{base}...{head}","merges_url":"https://api.github.com/repos/prestodb/presto/merges","archive_url":"https://api.github.com/repos/prestodb/presto/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/prestodb/presto/downloads","issues_url":"https://api.github.com/repos/prestodb/presto/issues{/number}","pulls_url":"https://api.github.com/repos/prestodb/presto/pulls{/number}","milestones_url":"https://api.github.com/repos/prestodb/presto/milestones{/number}","notifications_url":"https://api.github.com/repos/prestodb/presto/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/prestodb/presto/labels{/name}","releases_url":"https://api.github.com/repos/prestodb/presto/releases{/id}","deployments_url":"https://api.github.com/repos/prestodb/presto/deployments","created_at":"2012-08-09T01:03:37Z","updated_at":"2018-09-10T10:13:53Z","pushed_at":"2018-09-10T11:35:54Z","git_url":"git://github.com/prestodb/presto.git","ssh_url":"git@github.com:prestodb/presto.git","clone_url":"https://github.com/prestodb/presto.git","svn_url":"https://github.com/prestodb/presto","homepage":"https://prestodb.io","size":97954,"stargazers_count":8036,"watchers_count":8036,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2720,"mirror_url":null,"archived":false,"open_issues_count":1369,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":2720,"open_issues":1369,"watchers":8036,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/prestodb/presto/pulls/11072"},"html":{"href":"https://github.com/prestodb/presto/pull/11072"},"issue":{"href":"https://api.github.com/repos/prestodb/presto/issues/11072"},"comments":{"href":"https://api.github.com/repos/prestodb/presto/issues/11072/comments"},"review_comments":{"href":"https://api.github.com/repos/prestodb/presto/pulls/11072/comments"},"review_comment":{"href":"https://api.github.com/repos/prestodb/presto/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/prestodb/presto/pulls/11072/commits"},"statuses":{"href":"https://api.github.com/repos/prestodb/presto/statuses/9e3a4c20663800b4e5f881747c4a35f53367e9a1"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"mbasmanova"}}