{"action":"created","comment":{"url":"https://api.github.com/repos/hyrise/hyrise/pulls/comments/172865469","pull_request_review_id":101952654,"id":172865469,"diff_hunk":"@@ -698,55 +722,91 @@ class JoinHash::JoinHashImpl : public AbstractJoinOperatorImpl {\n \n       // we need to swap back the inputs, so that the order of the output columns is not harmed\n       if (_inputs_swapped) {\n-        write_output_chunks(output_chunk, _right_in_table, right, ref_col_right);\n+        write_output_chunks(output_chunk, _right_in_table, right_pos_lists_by_column, right, ref_col_right);\n \n         // Semi/Anti joins are always swapped but do not need the outer relation\n-        if (_mode != JoinMode::Semi && _mode != JoinMode::Anti) {\n-          write_output_chunks(output_chunk, _left_in_table, left, ref_col_left);\n+        if (only_output_right_input) {\n+          write_output_chunks(output_chunk, _left_in_table, left_pos_lists_by_column, left, ref_col_left);\n         }\n       } else {\n-        write_output_chunks(output_chunk, _left_in_table, left, ref_col_left);\n-        write_output_chunks(output_chunk, _right_in_table, right, ref_col_right);\n+        write_output_chunks(output_chunk, _left_in_table, left_pos_lists_by_column, left, ref_col_left);\n+        write_output_chunks(output_chunk, _right_in_table, right_pos_lists_by_column, right, ref_col_right);\n       }\n       _output_table->emplace_chunk(std::move(output_chunk));\n     }\n \n     return _output_table;\n   }\n \n+  // See usage in _on_execute() for doc.\n+  static PosListsByColumn setup_pos_lists_by_column(const std::shared_ptr<const Table> input_table) {\n+    std::map<PosLists, std::shared_ptr<PosLists>> shared_pos_lists_by_pos_lists;\n+\n+    PosListsByColumn pos_lists_by_column(input_table->column_count());\n+    auto pos_lists_by_column_it = pos_lists_by_column.begin();\n+\n+    const auto& input_chunks = input_table->chunks();\n+\n+    for (ColumnID column_id{0}; column_id < input_table->column_count(); ++column_id) {\n+      // Get all the input pos lists so that we only have to pointer cast the columns once\n+      auto pos_list_ptrs = std::make_shared<PosLists>(input_table->chunk_count());\n+      auto pos_lists_iter = pos_list_ptrs->begin();\n+\n+      for (ChunkID chunk_id{0}; chunk_id < input_table->chunk_count(); chunk_id++) {\n+        // This works because we assume that the columns have to be either all ReferenceColumns or none.\n+        const auto& ref_column =\n+            *static_cast<const ReferenceColumn*>(input_chunks[chunk_id]->columns()[column_id].get());\n+        *pos_lists_iter = ref_column.pos_list();\n+        ++pos_lists_iter;\n+      }\n+\n+      auto iter = shared_pos_lists_by_pos_lists.emplace(*pos_list_ptrs, pos_list_ptrs).first;\n+\n+      *pos_lists_by_column_it = iter->second;\n+      ++pos_lists_by_column_it;\n+    }\n+\n+    return pos_lists_by_column;\n+  }\n+\n   static void write_output_chunks(const std::shared_ptr<Chunk>& output_chunk,\n-                                  const std::shared_ptr<const Table> input_table, PosList& pos_list,\n+                                  const std::shared_ptr<const Table> input_table,\n+                                  const PosListsByColumn& input_pos_list_ptrs_sptrs_by_column, PosList& pos_list,\n                                   bool is_ref_column) {\n     if (pos_list.empty()) return;\n \n+    std::map<std::shared_ptr<PosLists>, std::shared_ptr<PosList>> output_pos_list_cache;\n+\n     // Add columns from input table to output chunk\n     for (ColumnID column_id{0}; column_id < input_table->column_count(); ++column_id) {\n       std::shared_ptr<BaseColumn> column;\n \n       if (is_ref_column) {\n-        auto ref_col =\n-            std::dynamic_pointer_cast<const ReferenceColumn>(input_table->get_chunk(ChunkID{0})->get_column(column_id));\n-\n-        // Get all the input pos lists so that we only have to pointer cast the columns once\n-        auto input_pos_lists = std::vector<std::shared_ptr<const PosList>>();\n-        for (ChunkID chunk_id{0}; chunk_id < input_table->chunk_count(); chunk_id++) {\n-          // This works because we assume that the columns have to be either all ReferenceColumns or none.\n-          auto ref_column =\n-              std::dynamic_pointer_cast<const ReferenceColumn>(input_table->get_chunk(chunk_id)->get_column(column_id));\n-          input_pos_lists.push_back(ref_column->pos_list());\n-        }\n-\n-        // Get the row ids that are referenced\n-        auto new_pos_list = std::make_shared<PosList>();\n-        for (const auto& row : pos_list) {\n-          if (row.chunk_offset == INVALID_CHUNK_OFFSET) {\n-            new_pos_list->push_back(row);\n-          } else {\n-            new_pos_list->push_back(input_pos_lists.at(row.chunk_id)->at(row.chunk_offset));\n+        const auto& input_table_pos_lists = input_pos_list_ptrs_sptrs_by_column[column_id];\n+\n+        auto iter = output_pos_list_cache.find(input_table_pos_lists);\n+        if (iter == output_pos_list_cache.end()) {\n+          // Get the row ids that are referenced\n+          const auto& input_table_pos_lists_ref = *input_table_pos_lists;","path":"src/lib/operators/join_hash.cpp","position":132,"original_position":132,"commit_id":"38fe4202ade3e4792b0a28322d69d4cae47d4a68","original_commit_id":"38fe4202ade3e4792b0a28322d69d4cae47d4a68","user":{"login":"mrks","id":575106,"avatar_url":"https://avatars2.githubusercontent.com/u/575106?v=4","gravatar_id":"","url":"https://api.github.com/users/mrks","html_url":"https://github.com/mrks","followers_url":"https://api.github.com/users/mrks/followers","following_url":"https://api.github.com/users/mrks/following{/other_user}","gists_url":"https://api.github.com/users/mrks/gists{/gist_id}","starred_url":"https://api.github.com/users/mrks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrks/subscriptions","organizations_url":"https://api.github.com/users/mrks/orgs","repos_url":"https://api.github.com/users/mrks/repos","events_url":"https://api.github.com/users/mrks/events{/privacy}","received_events_url":"https://api.github.com/users/mrks/received_events","type":"User","site_admin":false},"body":"Why is this defined here when it is only used once somewhere down?","created_at":"2018-03-07T14:49:19Z","updated_at":"2018-03-07T14:50:13Z","html_url":"https://github.com/hyrise/hyrise/pull/760#discussion_r172865469","pull_request_url":"https://api.github.com/repos/hyrise/hyrise/pulls/760","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/hyrise/hyrise/pulls/comments/172865469"},"html":{"href":"https://github.com/hyrise/hyrise/pull/760#discussion_r172865469"},"pull_request":{"href":"https://api.github.com/repos/hyrise/hyrise/pulls/760"}}},"pull_request":{"url":"https://api.github.com/repos/hyrise/hyrise/pulls/760","id":172897991,"html_url":"https://github.com/hyrise/hyrise/pull/760","diff_url":"https://github.com/hyrise/hyrise/pull/760.diff","patch_url":"https://github.com/hyrise/hyrise/pull/760.patch","issue_url":"https://api.github.com/repos/hyrise/hyrise/issues/760","number":760,"state":"open","locked":false,"title":"Faster JoinHash output assembly","user":{"login":"mrzzzrm","id":2679018,"avatar_url":"https://avatars3.githubusercontent.com/u/2679018?v=4","gravatar_id":"","url":"https://api.github.com/users/mrzzzrm","html_url":"https://github.com/mrzzzrm","followers_url":"https://api.github.com/users/mrzzzrm/followers","following_url":"https://api.github.com/users/mrzzzrm/following{/other_user}","gists_url":"https://api.github.com/users/mrzzzrm/gists{/gist_id}","starred_url":"https://api.github.com/users/mrzzzrm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrzzzrm/subscriptions","organizations_url":"https://api.github.com/users/mrzzzrm/orgs","repos_url":"https://api.github.com/users/mrzzzrm/repos","events_url":"https://api.github.com/users/mrzzzrm/events{/privacy}","received_events_url":"https://api.github.com/users/mrzzzrm/received_events","type":"User","site_admin":false},"body":"While trying to predict the costs for JoinHash, I noticed somewhat erratic performance (anything from 40ms to 1.5s for roughly the same number of input rows). This PR introduces a bit of caching to avoid redundant calculation of PosLists when joining Reference Tables.\r\n\r\nTPCH performance nicely increases by 355% for TPCH-3 and 240% for TPCH-10\r\n\r\nthis branch:\r\n```json\r\n{\r\n  \"benchmarks\": [\r\n    {\r\n      \"cpu_time\": 154903426,\r\n      \"items_per_second\": 6.45563507080078,\r\n      \"iterations\": 33,\r\n      \"name\": \"TPC-H 1\",\r\n      \"real_time\": 154903426,\r\n      \"time_unit\": \"ns\"\r\n    },\r\n    {\r\n      \"cpu_time\": 120605387,\r\n      \"items_per_second\": 8.29150390625,\r\n      \"iterations\": 42,\r\n      \"name\": \"TPC-H 3\",\r\n      \"real_time\": 120605387,\r\n      \"time_unit\": \"ns\"\r\n    },\r\n    {\r\n      \"cpu_time\": 345068374,\r\n      \"items_per_second\": 2.89797639846802,\r\n      \"iterations\": 15,\r\n      \"name\": \"TPC-H 5\",\r\n      \"real_time\": 345068374,\r\n      \"time_unit\": \"ns\"\r\n    },\r\n    {\r\n      \"cpu_time\": 2115483,\r\n      \"items_per_second\": 472.705230712891,\r\n      \"iterations\": 1000,\r\n      \"name\": \"TPC-H 6\",\r\n      \"real_time\": 2115483,\r\n      \"time_unit\": \"ns\"\r\n    },\r\n    {\r\n      \"cpu_time\": 816416877,\r\n      \"items_per_second\": 1.22486436367035,\r\n      \"iterations\": 7,\r\n      \"name\": \"TPC-H 9\",\r\n      \"real_time\": 816416877,\r\n      \"time_unit\": \"ns\"\r\n    },\r\n    {\r\n      \"cpu_time\": 193529734,\r\n      \"items_per_second\": 5.16716480255127,\r\n      \"iterations\": 26,\r\n      \"name\": \"TPC-H 10\",\r\n      \"real_time\": 193529734,\r\n      \"time_unit\": \"ns\"\r\n    }\r\n  ],\r\n  \"context\": {\r\n    \"benchmark_mode\": \"IndividualQueries\",\r\n    \"build_type\": \"release\",\r\n    \"chunk_size\": 4294967295,\r\n    \"date\": \"2018-03-05 16:02:46\",\r\n    \"scale_factor\": 0.00999999977648258\r\n  }\r\n}\r\n```\r\n\r\nmaster:\r\n```json\r\n{\r\n  \"benchmarks\": [\r\n    {\r\n      \"cpu_time\": 174671831,\r\n      \"items_per_second\": 5.72502136230469,\r\n      \"iterations\": 29,\r\n      \"name\": \"TPC-H 1\",\r\n      \"real_time\": 174671831,\r\n      \"time_unit\": \"ns\"\r\n    },\r\n    {\r\n      \"cpu_time\": 539360749,\r\n      \"items_per_second\": 1.85404658317566,\r\n      \"iterations\": 10,\r\n      \"name\": \"TPC-H 3\",\r\n      \"real_time\": 539360749,\r\n      \"time_unit\": \"ns\"\r\n    },\r\n    {\r\n      \"cpu_time\": 836498558,\r\n      \"items_per_second\": 1.19545936584473,\r\n      \"iterations\": 6,\r\n      \"name\": \"TPC-H 5\",\r\n      \"real_time\": 836498558,\r\n      \"time_unit\": \"ns\"\r\n    },\r\n    {\r\n      \"cpu_time\": 2085652,\r\n      \"items_per_second\": 479.466247558594,\r\n      \"iterations\": 1000,\r\n      \"name\": \"TPC-H 6\",\r\n      \"real_time\": 2085652,\r\n      \"time_unit\": \"ns\"\r\n    },\r\n    {\r\n      \"cpu_time\": 1888284852,\r\n      \"items_per_second\": 0.529581129550934,\r\n      \"iterations\": 3,\r\n      \"name\": \"TPC-H 9\",\r\n      \"real_time\": 1888284852,\r\n      \"time_unit\": \"ns\"\r\n    },\r\n    {\r\n      \"cpu_time\": 649493338,\r\n      \"items_per_second\": 1.53966164588928,\r\n      \"iterations\": 8,\r\n      \"name\": \"TPC-H 10\",\r\n      \"real_time\": 649493338,\r\n      \"time_unit\": \"ns\"\r\n    }\r\n  ],\r\n  \"context\": {\r\n    \"benchmark_mode\": \"IndividualQueries\",\r\n    \"build_type\": \"release\",\r\n    \"chunk_size\": 4294967295,\r\n    \"date\": \"2018-03-05 16:08:28\",\r\n    \"scale_factor\": 0.00999999977648258\r\n  }\r\n}\r\n```\r\n\r\n","created_at":"2018-03-05T15:24:48Z","updated_at":"2018-03-07T14:50:13Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e309bf4376cface235755325e10ecb80b5605914","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/hyrise/hyrise/pulls/760/commits","review_comments_url":"https://api.github.com/repos/hyrise/hyrise/pulls/760/comments","review_comment_url":"https://api.github.com/repos/hyrise/hyrise/pulls/comments{/number}","comments_url":"https://api.github.com/repos/hyrise/hyrise/issues/760/comments","statuses_url":"https://api.github.com/repos/hyrise/hyrise/statuses/38fe4202ade3e4792b0a28322d69d4cae47d4a68","head":{"label":"hyrise:feature/faster_join_hash_output","ref":"feature/faster_join_hash_output","sha":"38fe4202ade3e4792b0a28322d69d4cae47d4a68","user":{"login":"hyrise","id":3465095,"avatar_url":"https://avatars2.githubusercontent.com/u/3465095?v=4","gravatar_id":"","url":"https://api.github.com/users/hyrise","html_url":"https://github.com/hyrise","followers_url":"https://api.github.com/users/hyrise/followers","following_url":"https://api.github.com/users/hyrise/following{/other_user}","gists_url":"https://api.github.com/users/hyrise/gists{/gist_id}","starred_url":"https://api.github.com/users/hyrise/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyrise/subscriptions","organizations_url":"https://api.github.com/users/hyrise/orgs","repos_url":"https://api.github.com/users/hyrise/repos","events_url":"https://api.github.com/users/hyrise/events{/privacy}","received_events_url":"https://api.github.com/users/hyrise/received_events","type":"Organization","site_admin":false},"repo":{"id":87414843,"name":"hyrise","full_name":"hyrise/hyrise","owner":{"login":"hyrise","id":3465095,"avatar_url":"https://avatars2.githubusercontent.com/u/3465095?v=4","gravatar_id":"","url":"https://api.github.com/users/hyrise","html_url":"https://github.com/hyrise","followers_url":"https://api.github.com/users/hyrise/followers","following_url":"https://api.github.com/users/hyrise/following{/other_user}","gists_url":"https://api.github.com/users/hyrise/gists{/gist_id}","starred_url":"https://api.github.com/users/hyrise/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyrise/subscriptions","organizations_url":"https://api.github.com/users/hyrise/orgs","repos_url":"https://api.github.com/users/hyrise/repos","events_url":"https://api.github.com/users/hyrise/events{/privacy}","received_events_url":"https://api.github.com/users/hyrise/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/hyrise/hyrise","description":"A research in-memory database.","fork":false,"url":"https://api.github.com/repos/hyrise/hyrise","forks_url":"https://api.github.com/repos/hyrise/hyrise/forks","keys_url":"https://api.github.com/repos/hyrise/hyrise/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hyrise/hyrise/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hyrise/hyrise/teams","hooks_url":"https://api.github.com/repos/hyrise/hyrise/hooks","issue_events_url":"https://api.github.com/repos/hyrise/hyrise/issues/events{/number}","events_url":"https://api.github.com/repos/hyrise/hyrise/events","assignees_url":"https://api.github.com/repos/hyrise/hyrise/assignees{/user}","branches_url":"https://api.github.com/repos/hyrise/hyrise/branches{/branch}","tags_url":"https://api.github.com/repos/hyrise/hyrise/tags","blobs_url":"https://api.github.com/repos/hyrise/hyrise/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hyrise/hyrise/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hyrise/hyrise/git/refs{/sha}","trees_url":"https://api.github.com/repos/hyrise/hyrise/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hyrise/hyrise/statuses/{sha}","languages_url":"https://api.github.com/repos/hyrise/hyrise/languages","stargazers_url":"https://api.github.com/repos/hyrise/hyrise/stargazers","contributors_url":"https://api.github.com/repos/hyrise/hyrise/contributors","subscribers_url":"https://api.github.com/repos/hyrise/hyrise/subscribers","subscription_url":"https://api.github.com/repos/hyrise/hyrise/subscription","commits_url":"https://api.github.com/repos/hyrise/hyrise/commits{/sha}","git_commits_url":"https://api.github.com/repos/hyrise/hyrise/git/commits{/sha}","comments_url":"https://api.github.com/repos/hyrise/hyrise/comments{/number}","issue_comment_url":"https://api.github.com/repos/hyrise/hyrise/issues/comments{/number}","contents_url":"https://api.github.com/repos/hyrise/hyrise/contents/{+path}","compare_url":"https://api.github.com/repos/hyrise/hyrise/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hyrise/hyrise/merges","archive_url":"https://api.github.com/repos/hyrise/hyrise/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hyrise/hyrise/downloads","issues_url":"https://api.github.com/repos/hyrise/hyrise/issues{/number}","pulls_url":"https://api.github.com/repos/hyrise/hyrise/pulls{/number}","milestones_url":"https://api.github.com/repos/hyrise/hyrise/milestones{/number}","notifications_url":"https://api.github.com/repos/hyrise/hyrise/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hyrise/hyrise/labels{/name}","releases_url":"https://api.github.com/repos/hyrise/hyrise/releases{/id}","deployments_url":"https://api.github.com/repos/hyrise/hyrise/deployments","created_at":"2017-04-06T10:03:31Z","updated_at":"2018-03-06T20:53:49Z","pushed_at":"2018-03-07T14:40:14Z","git_url":"git://github.com/hyrise/hyrise.git","ssh_url":"git@github.com:hyrise/hyrise.git","clone_url":"https://github.com/hyrise/hyrise.git","svn_url":"https://github.com/hyrise/hyrise","homepage":"https://hpi.de/plattner/projects/hyrise.html","size":11987,"stargazers_count":59,"watchers_count":59,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":19,"mirror_url":null,"archived":false,"open_issues_count":78,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":19,"open_issues":78,"watchers":59,"default_branch":"master"}},"base":{"label":"hyrise:master","ref":"master","sha":"83127a543f438dfd05f8a67194fe3e1d96c0c07c","user":{"login":"hyrise","id":3465095,"avatar_url":"https://avatars2.githubusercontent.com/u/3465095?v=4","gravatar_id":"","url":"https://api.github.com/users/hyrise","html_url":"https://github.com/hyrise","followers_url":"https://api.github.com/users/hyrise/followers","following_url":"https://api.github.com/users/hyrise/following{/other_user}","gists_url":"https://api.github.com/users/hyrise/gists{/gist_id}","starred_url":"https://api.github.com/users/hyrise/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyrise/subscriptions","organizations_url":"https://api.github.com/users/hyrise/orgs","repos_url":"https://api.github.com/users/hyrise/repos","events_url":"https://api.github.com/users/hyrise/events{/privacy}","received_events_url":"https://api.github.com/users/hyrise/received_events","type":"Organization","site_admin":false},"repo":{"id":87414843,"name":"hyrise","full_name":"hyrise/hyrise","owner":{"login":"hyrise","id":3465095,"avatar_url":"https://avatars2.githubusercontent.com/u/3465095?v=4","gravatar_id":"","url":"https://api.github.com/users/hyrise","html_url":"https://github.com/hyrise","followers_url":"https://api.github.com/users/hyrise/followers","following_url":"https://api.github.com/users/hyrise/following{/other_user}","gists_url":"https://api.github.com/users/hyrise/gists{/gist_id}","starred_url":"https://api.github.com/users/hyrise/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/hyrise/subscriptions","organizations_url":"https://api.github.com/users/hyrise/orgs","repos_url":"https://api.github.com/users/hyrise/repos","events_url":"https://api.github.com/users/hyrise/events{/privacy}","received_events_url":"https://api.github.com/users/hyrise/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/hyrise/hyrise","description":"A research in-memory database.","fork":false,"url":"https://api.github.com/repos/hyrise/hyrise","forks_url":"https://api.github.com/repos/hyrise/hyrise/forks","keys_url":"https://api.github.com/repos/hyrise/hyrise/keys{/key_id}","collaborators_url":"https://api.github.com/repos/hyrise/hyrise/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/hyrise/hyrise/teams","hooks_url":"https://api.github.com/repos/hyrise/hyrise/hooks","issue_events_url":"https://api.github.com/repos/hyrise/hyrise/issues/events{/number}","events_url":"https://api.github.com/repos/hyrise/hyrise/events","assignees_url":"https://api.github.com/repos/hyrise/hyrise/assignees{/user}","branches_url":"https://api.github.com/repos/hyrise/hyrise/branches{/branch}","tags_url":"https://api.github.com/repos/hyrise/hyrise/tags","blobs_url":"https://api.github.com/repos/hyrise/hyrise/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/hyrise/hyrise/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/hyrise/hyrise/git/refs{/sha}","trees_url":"https://api.github.com/repos/hyrise/hyrise/git/trees{/sha}","statuses_url":"https://api.github.com/repos/hyrise/hyrise/statuses/{sha}","languages_url":"https://api.github.com/repos/hyrise/hyrise/languages","stargazers_url":"https://api.github.com/repos/hyrise/hyrise/stargazers","contributors_url":"https://api.github.com/repos/hyrise/hyrise/contributors","subscribers_url":"https://api.github.com/repos/hyrise/hyrise/subscribers","subscription_url":"https://api.github.com/repos/hyrise/hyrise/subscription","commits_url":"https://api.github.com/repos/hyrise/hyrise/commits{/sha}","git_commits_url":"https://api.github.com/repos/hyrise/hyrise/git/commits{/sha}","comments_url":"https://api.github.com/repos/hyrise/hyrise/comments{/number}","issue_comment_url":"https://api.github.com/repos/hyrise/hyrise/issues/comments{/number}","contents_url":"https://api.github.com/repos/hyrise/hyrise/contents/{+path}","compare_url":"https://api.github.com/repos/hyrise/hyrise/compare/{base}...{head}","merges_url":"https://api.github.com/repos/hyrise/hyrise/merges","archive_url":"https://api.github.com/repos/hyrise/hyrise/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/hyrise/hyrise/downloads","issues_url":"https://api.github.com/repos/hyrise/hyrise/issues{/number}","pulls_url":"https://api.github.com/repos/hyrise/hyrise/pulls{/number}","milestones_url":"https://api.github.com/repos/hyrise/hyrise/milestones{/number}","notifications_url":"https://api.github.com/repos/hyrise/hyrise/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/hyrise/hyrise/labels{/name}","releases_url":"https://api.github.com/repos/hyrise/hyrise/releases{/id}","deployments_url":"https://api.github.com/repos/hyrise/hyrise/deployments","created_at":"2017-04-06T10:03:31Z","updated_at":"2018-03-06T20:53:49Z","pushed_at":"2018-03-07T14:40:14Z","git_url":"git://github.com/hyrise/hyrise.git","ssh_url":"git@github.com:hyrise/hyrise.git","clone_url":"https://github.com/hyrise/hyrise.git","svn_url":"https://github.com/hyrise/hyrise","homepage":"https://hpi.de/plattner/projects/hyrise.html","size":11987,"stargazers_count":59,"watchers_count":59,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":19,"mirror_url":null,"archived":false,"open_issues_count":78,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":19,"open_issues":78,"watchers":59,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/hyrise/hyrise/pulls/760"},"html":{"href":"https://github.com/hyrise/hyrise/pull/760"},"issue":{"href":"https://api.github.com/repos/hyrise/hyrise/issues/760"},"comments":{"href":"https://api.github.com/repos/hyrise/hyrise/issues/760/comments"},"review_comments":{"href":"https://api.github.com/repos/hyrise/hyrise/pulls/760/comments"},"review_comment":{"href":"https://api.github.com/repos/hyrise/hyrise/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/hyrise/hyrise/pulls/760/commits"},"statuses":{"href":"https://api.github.com/repos/hyrise/hyrise/statuses/38fe4202ade3e4792b0a28322d69d4cae47d4a68"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"mrks"}}