{"action":"created","comment":{"url":"https://api.github.com/repos/cmu-db/peloton/pulls/comments/181936962","pull_request_review_id":112254768,"id":181936962,"diff_hunk":"@@ -0,0 +1,186 @@\n+\n+#include <cstdio>\n+#include <sstream>\n+\n+#include \"catalog/schema.h\"\n+#include \"common/exception.h\"\n+#include \"common/macros.h\"\n+#include \"type/serializer.h\"\n+#include \"common/internal_types.h\"\n+#include \"type/ephemeral_pool.h\"\n+#include \"concurrency/transaction_manager_factory.h\"\n+#include \"storage/backend_manager.h\"\n+#include \"storage/tile.h\"\n+#include \"storage/tile_group_header.h\"\n+#include \"storage/tuple.h\"\n+#include \"storage/tuple_iterator.h\"\n+#include \"storage/dictionary_encoding_tile.h\"\n+\n+namespace peloton {\n+namespace storage {\n+\n+DictEncodedTile::DictEncodedTile(BackendType backend_type, TileGroupHeader *tile_header,\n+     const catalog::Schema &tuple_schema, TileGroup *tile_group,\n+     int tuple_count) : Tile(backend_type, tile_header, tuple_schema, tile_group, tuple_count),\n+     is_dict_encoded(false),\n+     original_schema(tuple_schema) {\n+\tstd::vector<catalog::Column> columns;\n+\tsize_t offset = 0;\n+\n+\t// find out which column to encode\n+\tfor (oid_t i = 0; i < column_count; i++) {\n+\t\tauto column_type = schema.GetType(i);\n+\t\toriginal_schema_offsets.emplace(offset, i);\n+\t\tif (column_type == type::TypeId::VARCHAR ||\n+\t\t\t\tcolumn_type == type::TypeId::VARBINARY) {\n+\t\t\tcatalog::Column encoded_column(type::TypeId::TINYINT,\n+\t\t\t\ttype::Type::GetTypeSize(type::TypeId::TINYINT),\n+\t\t\t\tschema.GetColumn(i).GetName(), true);\n+\t\t\tcolumns.push_back(encoded_column);\n+\t\t\tdict_encoded_columns.insert(i);\n+\t\t} else {\n+\t\t\tcolumns.push_back(schema.GetColumn(i));\n+\t\t}\n+\t\toffset += schema.GetLength(i);\n+\t}\n+\n+\t// if nothing needs to be encoded\n+\tif (dict_encoded_columns.empty()) return;\n+\n+\tdelete[] data;\n+\tschema = catalog::Schema(columns);\n+\ttuple_length = schema.GetLength();\n+\ttile_size = num_tuple_slots * tuple_length;\n+\tdata = new char[tile_size];\n+}\n+\n+// delete data is enough\n+DictEncodedTile::~DictEncodedTile(){}\n+\n+type::Value DictEncodedTile::GetValue(const oid_t tuple_offset, const oid_t column_id) {\n+\tif (dict_encoded_columns.count(column_id) > 0) {\n+\t\t// encoded\n+\t\tauto idx_val = Tile::GetValue(tuple_offset, column_id);\n+\t\tauto idx = idx_val.GetAs<uint8_t>();\n+    return type::Value(element_array[idx]);\n+\t} else {\n+\t\treturn Tile::GetValue(tuple_offset, column_id);\n+\t}\n+}\n+\n+// assume offset is based on original schema, so get schema give original schema\n+type::Value DictEncodedTile::GetValueFast(const oid_t tuple_offset, const size_t column_offset,\n+                           const type::TypeId column_type,\n+                           const bool is_inlined){\n+  auto column_id = original_schema_offsets[column_offset];\n+\tauto curr_val = Tile::GetValueFast(tuple_offset, schema.GetOffset(column_id),\n+\t  column_type, is_inlined);\n+\tif (dict_encoded_columns.count(column_id) > 0) {\n+\t\tauto idx_val = Tile::GetValue(tuple_offset, column_id);\n+\t\tauto idx = idx_val.GetAs<uint8_t>();\n+    return type::Value(element_array[idx]);\n+\t} else {\n+\t\treturn curr_val;\n+\t}\n+}\n+\n+//void DictEncodedTile::SetValue(const type::Value &value, const oid_t tuple_offset,\n+//                const oid_t column_id){\n+//\n+//}\n+\n+void DictEncodedTile::DictEncode(Tile *tile) {\n+\tif (is_dict_encoded) return;\n+\tLOG_INFO(\"dictionary encode, database_id: %d, table_id: %d, tile_group_id: %d\"\n+\t\t\t\t\", tile_id: %d\", database_id, table_id, tile_group_id, tile_id);\n+\n+\t// use a 2d vector to save the data\n+\tstd::vector<std::vector<type::Value>> new_data_vector(column_count);\n+\n+\tfor (oid_t i = 0; i < column_count; i++) {\n+\t\t// if it is inlined, no need to compress!\n+\t\tif (dict_encoded_columns.count(i) > 0) {\n+\t\t\tLOG_INFO(\"encoding column %s\", schema.GetColumn(i).column_name.c_str());\n+\t\t\t// to for tuple offset\n+\t\t\tfor (oid_t to = 0; to < num_tuple_slots; to++) {\n+\t\t\t\ttype::Value curr_old_val = tile->GetValue(to, i);\n+\t\t\t\ttype::Value curr_val;\n+\t\t\t\tif (curr_old_val.GetTypeId() == type::TypeId::VARBINARY) {\n+\t\t\t\t\tcurr_val = type::ValueFactory::GetVarbinaryValue((const unsigned char*) curr_old_val.GetData(),\n+\t\t\t\t\t    curr_old_val.GetLength(), true);\n+\t\t\t\t} else {\n+\t\t\t\t\tcurr_val = type::ValueFactory::GetVarcharValue(curr_old_val.GetData(), curr_old_val.GetLength(),\n+\t\t\t\t\t\t\ttrue);\n+\t\t\t\t}\n+\t\t\t\tLOG_INFO(\"%s\", curr_val.GetInfo().c_str());\n+\t\t\t\t// assume the idx take 1 byte\n+\t\t\t\tchar idx_data[1];\n+\t\t\t\tif (dict.count(curr_val) == 0) {\n+\t\t\t\t\tLOG_INFO(\"Encoding!!!!!\");\n+\t\t\t\t\telement_array.push_back(curr_val);\n+\t\t\t\t\tidx_data[0] = element_array.size() - 1;\n+\t\t\t\t\tdict.emplace(curr_val, idx_data[0]);\n+\t\t\t\t} else {\n+\t\t\t\t\tLOG_INFO(\"Already encoded!!!\");\n+\t\t\t\t\tidx_data[0] = dict[curr_val];\n+\t\t\t\t}\n+\t\t\t\t// many constructor of Value is private, so use\n+\t\t\t\t// DeserializeFrom to construct the idx Value\n+\t\t\t\ttype::Value idx_val(type::Value::DeserializeFrom(idx_data, type::TypeId::TINYINT, true));\n+\t\t\t\tnew_data_vector[i].push_back(idx_val);\n+\t\t\t}\n+\t\t} else {\n+\t\t\tfor (oid_t to = 0; to < num_tuple_slots; to++) {\n+\t\t\t\tnew_data_vector[i].push_back(tile->GetValue(to, i));\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\t// now we have all data in new_data_vector\n+\t// put new data into storage space\n+\n+\tfor (oid_t i = 0; i < column_count; i++) {\n+\t\tfor (oid_t to = 0; to < num_tuple_slots; to++) {\n+\t\t\tSetValueFast(new_data_vector[i][to], to, schema.GetOffset(i), schema.IsInlined(i),\n+\t\t\t\t\tschema.GetLength(i));\n+\t\t}\n+\t}\n+\tis_dict_encoded = true;\n+}\n+\n+Tile* DictEncodedTile::DictDecode() {\n+\tif (!is_dict_encoded) return nullptr;\n+  LOG_INFO(\"dictionary decode, database_id: %d, table_id: %d, tile_group_id: %d\"\n+\t\t\t\t\t\", tile_id: %d\", database_id, table_id, tile_group_id, tile_id);\n+  // new data mean decoded data\n+  std::vector<std::vector<type::Value>> new_data_vector(column_count);\n+  for (oid_t i = 0; i < column_count; i++) {\n+    if (dict_encoded_columns.count(i) > 0) {\n+      LOG_INFO(\"decoding column %s\", schema.GetColumn(i).column_name.c_str());\n+      for (oid_t to = 0; to < num_tuple_slots; to++) {\n+        type::Value curr_val = Tile::GetValue(to, i);\n+        auto idx = curr_val.GetAs<uint8_t>();\n+        type::Value actual_val = element_array[idx];\n+        new_data_vector[i].push_back(actual_val);\n+      }\n+    } else {\n+      for (oid_t to = 0; to < num_tuple_slots; to++) {\n+        new_data_vector[i].push_back(GetValue(to, i));\n+      }\n+    }\n+\t}\n+\n+  auto *new_tile = new Tile(backend_type, tile_group_header, original_schema, tile_group, num_tuple_slots);\n+  for (oid_t i = 0; i < column_count; i++) {\n+\t\tfor (oid_t to = 0; to < num_tuple_slots; to++) {\n+\t\t\tnew_tile->SetValueFast(new_data_vector[i][to], to, original_schema.GetOffset(i), original_schema.IsInlined(i),","path":"src/storage/dictionary_encoding_tile.cpp","position":176,"original_position":176,"commit_id":"f9f3a6f0a465587a4f0b6967338be5d9a32aee63","original_commit_id":"f9f3a6f0a465587a4f0b6967338be5d9a32aee63","user":{"login":"dqrs","id":175465,"avatar_url":"https://avatars2.githubusercontent.com/u/175465?v=4","gravatar_id":"","url":"https://api.github.com/users/dqrs","html_url":"https://github.com/dqrs","followers_url":"https://api.github.com/users/dqrs/followers","following_url":"https://api.github.com/users/dqrs/following{/other_user}","gists_url":"https://api.github.com/users/dqrs/gists{/gist_id}","starred_url":"https://api.github.com/users/dqrs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dqrs/subscriptions","organizations_url":"https://api.github.com/users/dqrs/orgs","repos_url":"https://api.github.com/users/dqrs/repos","events_url":"https://api.github.com/users/dqrs/events{/privacy}","received_events_url":"https://api.github.com/users/dqrs/received_events","type":"User","site_admin":false},"body":"Wouldn't it be faster and use less memory to set the decoded Tile's values directly from the encoded tile's values? Why incur the cost of allocating, reading, and writing, to the separate \"new_data_vector\"?","created_at":"2018-04-17T02:26:27Z","updated_at":"2018-04-17T02:35:30Z","html_url":"https://github.com/cmu-db/peloton/pull/1279#discussion_r181936962","pull_request_url":"https://api.github.com/repos/cmu-db/peloton/pulls/1279","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/cmu-db/peloton/pulls/comments/181936962"},"html":{"href":"https://github.com/cmu-db/peloton/pull/1279#discussion_r181936962"},"pull_request":{"href":"https://api.github.com/repos/cmu-db/peloton/pulls/1279"}}},"pull_request":{"url":"https://api.github.com/repos/cmu-db/peloton/pulls/1279","id":180961450,"html_url":"https://github.com/cmu-db/peloton/pull/1279","diff_url":"https://github.com/cmu-db/peloton/pull/1279.diff","patch_url":"https://github.com/cmu-db/peloton/pull/1279.patch","issue_url":"https://api.github.com/repos/cmu-db/peloton/issues/1279","number":1279,"state":"open","locked":false,"title":"[15721] Data Compression","user":{"login":"suafeng","id":5868785,"avatar_url":"https://avatars1.githubusercontent.com/u/5868785?v=4","gravatar_id":"","url":"https://api.github.com/users/suafeng","html_url":"https://github.com/suafeng","followers_url":"https://api.github.com/users/suafeng/followers","following_url":"https://api.github.com/users/suafeng/following{/other_user}","gists_url":"https://api.github.com/users/suafeng/gists{/gist_id}","starred_url":"https://api.github.com/users/suafeng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/suafeng/subscriptions","organizations_url":"https://api.github.com/users/suafeng/orgs","repos_url":"https://api.github.com/users/suafeng/repos","events_url":"https://api.github.com/users/suafeng/events{/privacy}","received_events_url":"https://api.github.com/users/suafeng/received_events","type":"User","site_admin":false},"body":"Add dictionary encoding.\r\n\r\n## Created: \r\ndictionary_encoding_tile.h\r\ndictionary_encoding_tile.cpp\r\n\r\n### Description\r\nCreate a new class DictEncodedTile. This class inherits from Tile class. The most important functions of DictEncodedTile are DictEncode(), which takes a pointer of a tile as argument and encodes this tile's content, and DictDecode(), which return a new tile with the decoded data.\r\n\r\nThe main idea of encoding is to replace VARCHAR and VARBINARY data with TINYINT (or other numeric types), the mappings are stored as fields in the class.\r\n\r\n## Modified:\r\ntile.h\r\ntile.cpp\r\n\r\n### Description\r\nMake minor changes to these files.\r\n\r\n## Testcase\r\ntile_compress_test.cpp\r\n\r\n### Description\r\n\r\nCorrectness test. Check whether the original tile is the same after encoding and decoding. Check the correctness of GetValue() function.\r\n\r\n\r\n\r\n","created_at":"2018-04-11T16:32:56Z","updated_at":"2018-04-17T02:35:30Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6950cc0b2632f3248e06ea6d565d9e7837927574","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":898811091,"url":"https://api.github.com/repos/cmu-db/peloton/labels/class-project","name":"class-project","color":"2a55aa","default":false},{"id":325402872,"url":"https://api.github.com/repos/cmu-db/peloton/labels/do%20not%20merge","name":"do not merge","color":"e11d21","default":false},{"id":747453861,"url":"https://api.github.com/repos/cmu-db/peloton/labels/in%20progress","name":"in progress","color":"e5fc37","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/cmu-db/peloton/pulls/1279/commits","review_comments_url":"https://api.github.com/repos/cmu-db/peloton/pulls/1279/comments","review_comment_url":"https://api.github.com/repos/cmu-db/peloton/pulls/comments{/number}","comments_url":"https://api.github.com/repos/cmu-db/peloton/issues/1279/comments","statuses_url":"https://api.github.com/repos/cmu-db/peloton/statuses/f9f3a6f0a465587a4f0b6967338be5d9a32aee63","head":{"label":"suafeng:master","ref":"master","sha":"f9f3a6f0a465587a4f0b6967338be5d9a32aee63","user":{"login":"suafeng","id":5868785,"avatar_url":"https://avatars1.githubusercontent.com/u/5868785?v=4","gravatar_id":"","url":"https://api.github.com/users/suafeng","html_url":"https://github.com/suafeng","followers_url":"https://api.github.com/users/suafeng/followers","following_url":"https://api.github.com/users/suafeng/following{/other_user}","gists_url":"https://api.github.com/users/suafeng/gists{/gist_id}","starred_url":"https://api.github.com/users/suafeng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/suafeng/subscriptions","organizations_url":"https://api.github.com/users/suafeng/orgs","repos_url":"https://api.github.com/users/suafeng/repos","events_url":"https://api.github.com/users/suafeng/events{/privacy}","received_events_url":"https://api.github.com/users/suafeng/received_events","type":"User","site_admin":false},"repo":{"id":127194710,"name":"peloton","full_name":"suafeng/peloton","owner":{"login":"suafeng","id":5868785,"avatar_url":"https://avatars1.githubusercontent.com/u/5868785?v=4","gravatar_id":"","url":"https://api.github.com/users/suafeng","html_url":"https://github.com/suafeng","followers_url":"https://api.github.com/users/suafeng/followers","following_url":"https://api.github.com/users/suafeng/following{/other_user}","gists_url":"https://api.github.com/users/suafeng/gists{/gist_id}","starred_url":"https://api.github.com/users/suafeng/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/suafeng/subscriptions","organizations_url":"https://api.github.com/users/suafeng/orgs","repos_url":"https://api.github.com/users/suafeng/repos","events_url":"https://api.github.com/users/suafeng/events{/privacy}","received_events_url":"https://api.github.com/users/suafeng/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/suafeng/peloton","description":"The Self-Driving Database Management System","fork":true,"url":"https://api.github.com/repos/suafeng/peloton","forks_url":"https://api.github.com/repos/suafeng/peloton/forks","keys_url":"https://api.github.com/repos/suafeng/peloton/keys{/key_id}","collaborators_url":"https://api.github.com/repos/suafeng/peloton/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/suafeng/peloton/teams","hooks_url":"https://api.github.com/repos/suafeng/peloton/hooks","issue_events_url":"https://api.github.com/repos/suafeng/peloton/issues/events{/number}","events_url":"https://api.github.com/repos/suafeng/peloton/events","assignees_url":"https://api.github.com/repos/suafeng/peloton/assignees{/user}","branches_url":"https://api.github.com/repos/suafeng/peloton/branches{/branch}","tags_url":"https://api.github.com/repos/suafeng/peloton/tags","blobs_url":"https://api.github.com/repos/suafeng/peloton/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/suafeng/peloton/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/suafeng/peloton/git/refs{/sha}","trees_url":"https://api.github.com/repos/suafeng/peloton/git/trees{/sha}","statuses_url":"https://api.github.com/repos/suafeng/peloton/statuses/{sha}","languages_url":"https://api.github.com/repos/suafeng/peloton/languages","stargazers_url":"https://api.github.com/repos/suafeng/peloton/stargazers","contributors_url":"https://api.github.com/repos/suafeng/peloton/contributors","subscribers_url":"https://api.github.com/repos/suafeng/peloton/subscribers","subscription_url":"https://api.github.com/repos/suafeng/peloton/subscription","commits_url":"https://api.github.com/repos/suafeng/peloton/commits{/sha}","git_commits_url":"https://api.github.com/repos/suafeng/peloton/git/commits{/sha}","comments_url":"https://api.github.com/repos/suafeng/peloton/comments{/number}","issue_comment_url":"https://api.github.com/repos/suafeng/peloton/issues/comments{/number}","contents_url":"https://api.github.com/repos/suafeng/peloton/contents/{+path}","compare_url":"https://api.github.com/repos/suafeng/peloton/compare/{base}...{head}","merges_url":"https://api.github.com/repos/suafeng/peloton/merges","archive_url":"https://api.github.com/repos/suafeng/peloton/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/suafeng/peloton/downloads","issues_url":"https://api.github.com/repos/suafeng/peloton/issues{/number}","pulls_url":"https://api.github.com/repos/suafeng/peloton/pulls{/number}","milestones_url":"https://api.github.com/repos/suafeng/peloton/milestones{/number}","notifications_url":"https://api.github.com/repos/suafeng/peloton/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/suafeng/peloton/labels{/name}","releases_url":"https://api.github.com/repos/suafeng/peloton/releases{/id}","deployments_url":"https://api.github.com/repos/suafeng/peloton/deployments","created_at":"2018-03-28T20:28:39Z","updated_at":"2018-04-11T20:29:11Z","pushed_at":"2018-04-11T20:29:09Z","git_url":"git://github.com/suafeng/peloton.git","ssh_url":"git@github.com:suafeng/peloton.git","clone_url":"https://github.com/suafeng/peloton.git","svn_url":"https://github.com/suafeng/peloton","homepage":"http://pelotondb.io","size":68000,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"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"},"forks":2,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"cmu-db:master","ref":"master","sha":"c5ba8004c6f0f10472aa004303c04be1c860ade9","user":{"login":"cmu-db","id":6220241,"avatar_url":"https://avatars0.githubusercontent.com/u/6220241?v=4","gravatar_id":"","url":"https://api.github.com/users/cmu-db","html_url":"https://github.com/cmu-db","followers_url":"https://api.github.com/users/cmu-db/followers","following_url":"https://api.github.com/users/cmu-db/following{/other_user}","gists_url":"https://api.github.com/users/cmu-db/gists{/gist_id}","starred_url":"https://api.github.com/users/cmu-db/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cmu-db/subscriptions","organizations_url":"https://api.github.com/users/cmu-db/orgs","repos_url":"https://api.github.com/users/cmu-db/repos","events_url":"https://api.github.com/users/cmu-db/events{/privacy}","received_events_url":"https://api.github.com/users/cmu-db/received_events","type":"Organization","site_admin":false},"repo":{"id":28202609,"name":"peloton","full_name":"cmu-db/peloton","owner":{"login":"cmu-db","id":6220241,"avatar_url":"https://avatars0.githubusercontent.com/u/6220241?v=4","gravatar_id":"","url":"https://api.github.com/users/cmu-db","html_url":"https://github.com/cmu-db","followers_url":"https://api.github.com/users/cmu-db/followers","following_url":"https://api.github.com/users/cmu-db/following{/other_user}","gists_url":"https://api.github.com/users/cmu-db/gists{/gist_id}","starred_url":"https://api.github.com/users/cmu-db/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cmu-db/subscriptions","organizations_url":"https://api.github.com/users/cmu-db/orgs","repos_url":"https://api.github.com/users/cmu-db/repos","events_url":"https://api.github.com/users/cmu-db/events{/privacy}","received_events_url":"https://api.github.com/users/cmu-db/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/cmu-db/peloton","description":"The Self-Driving Database Management System","fork":false,"url":"https://api.github.com/repos/cmu-db/peloton","forks_url":"https://api.github.com/repos/cmu-db/peloton/forks","keys_url":"https://api.github.com/repos/cmu-db/peloton/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cmu-db/peloton/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cmu-db/peloton/teams","hooks_url":"https://api.github.com/repos/cmu-db/peloton/hooks","issue_events_url":"https://api.github.com/repos/cmu-db/peloton/issues/events{/number}","events_url":"https://api.github.com/repos/cmu-db/peloton/events","assignees_url":"https://api.github.com/repos/cmu-db/peloton/assignees{/user}","branches_url":"https://api.github.com/repos/cmu-db/peloton/branches{/branch}","tags_url":"https://api.github.com/repos/cmu-db/peloton/tags","blobs_url":"https://api.github.com/repos/cmu-db/peloton/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cmu-db/peloton/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cmu-db/peloton/git/refs{/sha}","trees_url":"https://api.github.com/repos/cmu-db/peloton/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cmu-db/peloton/statuses/{sha}","languages_url":"https://api.github.com/repos/cmu-db/peloton/languages","stargazers_url":"https://api.github.com/repos/cmu-db/peloton/stargazers","contributors_url":"https://api.github.com/repos/cmu-db/peloton/contributors","subscribers_url":"https://api.github.com/repos/cmu-db/peloton/subscribers","subscription_url":"https://api.github.com/repos/cmu-db/peloton/subscription","commits_url":"https://api.github.com/repos/cmu-db/peloton/commits{/sha}","git_commits_url":"https://api.github.com/repos/cmu-db/peloton/git/commits{/sha}","comments_url":"https://api.github.com/repos/cmu-db/peloton/comments{/number}","issue_comment_url":"https://api.github.com/repos/cmu-db/peloton/issues/comments{/number}","contents_url":"https://api.github.com/repos/cmu-db/peloton/contents/{+path}","compare_url":"https://api.github.com/repos/cmu-db/peloton/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cmu-db/peloton/merges","archive_url":"https://api.github.com/repos/cmu-db/peloton/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cmu-db/peloton/downloads","issues_url":"https://api.github.com/repos/cmu-db/peloton/issues{/number}","pulls_url":"https://api.github.com/repos/cmu-db/peloton/pulls{/number}","milestones_url":"https://api.github.com/repos/cmu-db/peloton/milestones{/number}","notifications_url":"https://api.github.com/repos/cmu-db/peloton/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cmu-db/peloton/labels{/name}","releases_url":"https://api.github.com/repos/cmu-db/peloton/releases{/id}","deployments_url":"https://api.github.com/repos/cmu-db/peloton/deployments","created_at":"2014-12-18T21:35:23Z","updated_at":"2018-04-15T00:39:12Z","pushed_at":"2018-04-17T01:51:35Z","git_url":"git://github.com/cmu-db/peloton.git","ssh_url":"git@github.com:cmu-db/peloton.git","clone_url":"https://github.com/cmu-db/peloton.git","svn_url":"https://github.com/cmu-db/peloton","homepage":"http://pelotondb.io","size":68660,"stargazers_count":1194,"watchers_count":1194,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":448,"mirror_url":null,"archived":false,"open_issues_count":144,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":448,"open_issues":144,"watchers":1194,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/cmu-db/peloton/pulls/1279"},"html":{"href":"https://github.com/cmu-db/peloton/pull/1279"},"issue":{"href":"https://api.github.com/repos/cmu-db/peloton/issues/1279"},"comments":{"href":"https://api.github.com/repos/cmu-db/peloton/issues/1279/comments"},"review_comments":{"href":"https://api.github.com/repos/cmu-db/peloton/pulls/1279/comments"},"review_comment":{"href":"https://api.github.com/repos/cmu-db/peloton/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/cmu-db/peloton/pulls/1279/commits"},"statuses":{"href":"https://api.github.com/repos/cmu-db/peloton/statuses/f9f3a6f0a465587a4f0b6967338be5d9a32aee63"}},"author_association":"NONE"}}
{"actor":{"display_login":"dqrs"}}