{"action":"created","comment":{"url":"https://api.github.com/repos/apache/parquet-cpp/pulls/comments/76548232","id":76548232,"diff_hunk":"@@ -0,0 +1,525 @@\n+// Licensed to the Apache Software Foundation (ASF) under one\n+// or more contributor license agreements.  See the NOTICE file\n+// distributed with this work for additional information\n+// regarding copyright ownership.  The ASF licenses this file\n+// to you under the Apache License, Version 2.0 (the\n+// \"License\"); you may not use this file except in compliance\n+// with the License.  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,\n+// software distributed under the License is distributed on an\n+// \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n+// KIND, either express or implied.  See the License for the\n+// specific language governing permissions and limitations\n+// under the License.\n+\n+#include <vector>\n+\n+#include \"parquet/file/metadata.h\"\n+#include \"parquet/schema/converter.h\"\n+#include \"parquet/thrift/util.h\"\n+\n+namespace parquet {\n+\n+// MetaData Accessor\n+// Column metadata\n+class ColumnMetaData::ColumnMetaDataImpl {\n+ public:\n+  explicit ColumnMetaDataImpl(const format::ColumnChunk* column) : column_(column) {}\n+  ~ColumnMetaDataImpl() {}\n+\n+  // column chunk\n+  int64_t file_offset() const { return column_->file_offset; }\n+  const std::string& file_path() const { return column_->file_path; }\n+\n+  // column metadata\n+  Type::type type() { return FromThrift(column_->meta_data.type); }\n+\n+  int64_t num_values() const { return column_->meta_data.num_values; }\n+  const std::shared_ptr<schema::ColumnPath> path_in_schema() {\n+    return std::make_shared<schema::ColumnPath>(column_->meta_data.path_in_schema);\n+  }\n+\n+  bool IsStatsSet() const { return column_->meta_data.__isset.statistics; }\n+\n+  ColumnStatistics GetStats() const {\n+    const format::ColumnMetaData& meta_data = column_->meta_data;\n+\n+    ColumnStatistics result;\n+    result.null_count = meta_data.statistics.null_count;\n+    result.distinct_count = meta_data.statistics.distinct_count;\n+    result.max = &meta_data.statistics.max;\n+    result.min = &meta_data.statistics.min;\n+    return result;\n+  }\n+\n+  Compression::type GetCompression() const {\n+    return FromThrift(column_->meta_data.codec);\n+  }\n+\n+  std::vector<Encoding::type> GetEncodings() const {\n+    const format::ColumnMetaData& meta_data = column_->meta_data;\n+\n+    std::vector<Encoding::type> encodings;\n+    for (auto encoding : meta_data.encodings) {\n+      encodings.push_back(FromThrift(encoding));\n+    }\n+    return encodings;\n+  }\n+\n+  int64_t GetCompressedSize() const { return column_->meta_data.total_uncompressed_size; }\n+\n+  int64_t GetUnCompressedSize() const { return column_->meta_data.total_compressed_size; }\n+\n+ private:\n+  const format::ColumnChunk* column_;\n+};\n+\n+std::unique_ptr<ColumnMetaData> ColumnMetaData::GetColumnMetaData(\n+    const uint8_t* metadata) {\n+  return std::unique_ptr<ColumnMetaData>(new ColumnMetaData(metadata));\n+}\n+\n+ColumnMetaData::ColumnMetaData(const uint8_t* metadata)\n+    : impl_{std::unique_ptr<ColumnMetaDataImpl>(new ColumnMetaDataImpl(\n+          reinterpret_cast<const format::ColumnChunk*>(metadata)))} {}\n+ColumnMetaData::~ColumnMetaData() {}\n+\n+// column chunk\n+int64_t ColumnMetaData::file_offset() const {\n+  return impl_->file_offset();\n+}\n+\n+const std::string& ColumnMetaData::file_path() const {\n+  return impl_->file_path();\n+}\n+\n+// column metadata\n+Type::type ColumnMetaData::type() const {\n+  return impl_->type();\n+}\n+\n+int64_t ColumnMetaData::num_values() const {\n+  return impl_->num_values();\n+}\n+\n+const std::shared_ptr<schema::ColumnPath> ColumnMetaData::path_in_schema() const {\n+  return impl_->path_in_schema();\n+}\n+\n+ColumnStatistics ColumnMetaData::GetStats() const {\n+  return impl_->GetStats();\n+}\n+\n+bool ColumnMetaData::IsStatsSet() const {\n+  return impl_->IsStatsSet();\n+}\n+\n+Compression::type ColumnMetaData::GetCompression() const {\n+  return impl_->GetCompression();\n+}\n+\n+std::vector<Encoding::type> ColumnMetaData::GetEncodings() const {\n+  return impl_->GetEncodings();\n+}\n+\n+int64_t ColumnMetaData::GetUnCompressedSize() const {\n+  return impl_->GetUnCompressedSize();\n+}\n+\n+int64_t ColumnMetaData::GetCompressedSize() const {\n+  return impl_->GetCompressedSize();\n+}\n+\n+// row-group metadata\n+class RowGroupMetaData::RowGroupMetaDataImpl {\n+ public:\n+  explicit RowGroupMetaDataImpl(const format::RowGroup* row_group)\n+      : row_group_(row_group) {}\n+  ~RowGroupMetaDataImpl() {}\n+\n+  int num_columns() const { return row_group_->columns.size(); }\n+\n+  int64_t num_rows() const { return row_group_->num_rows; }\n+\n+  int64_t total_byte_size() const { return row_group_->total_byte_size; }\n+\n+  std::unique_ptr<ColumnMetaData> GetColumnMetaData(int i) {\n+    DCHECK(i < num_columns()) << \"The file only has \" << num_columns()\n+                              << \" columns, requested metadata for column: \" << i;\n+    return ColumnMetaData::GetColumnMetaData(\n+        reinterpret_cast<const uint8_t*>(&row_group_->columns[i]));\n+  }\n+\n+ private:\n+  const format::RowGroup* row_group_;\n+};\n+\n+std::unique_ptr<RowGroupMetaData> RowGroupMetaData::GetRowGroupMetaData(\n+    const uint8_t* metadata) {\n+  return std::unique_ptr<RowGroupMetaData>(new RowGroupMetaData(metadata));\n+}\n+\n+RowGroupMetaData::RowGroupMetaData(const uint8_t* metadata)\n+    : impl_{std::unique_ptr<RowGroupMetaDataImpl>(new RowGroupMetaDataImpl(\n+          reinterpret_cast<const format::RowGroup*>(metadata)))} {}\n+RowGroupMetaData::~RowGroupMetaData() {}\n+\n+int RowGroupMetaData::num_columns() const {\n+  return impl_->num_columns();\n+}\n+\n+int64_t RowGroupMetaData::num_rows() const {\n+  return impl_->num_rows();\n+}\n+\n+int64_t RowGroupMetaData::total_byte_size() const {\n+  return impl_->total_byte_size();\n+}\n+\n+std::unique_ptr<ColumnMetaData> RowGroupMetaData::GetColumnMetaData(int i) const {\n+  return impl_->GetColumnMetaData(i);\n+}\n+\n+// file metadata\n+class FileMetaData::FileMetaDataImpl {\n+ public:\n+  explicit FileMetaDataImpl(const uint8_t* metadata)\n+      : metadata_{std::unique_ptr<const format::FileMetaData>(\n+            reinterpret_cast<const format::FileMetaData*>(metadata))} {\n+    schema::FlatSchemaConverter converter(\n+        &metadata_->schema[0], metadata_->schema.size());\n+    schema_.Init(converter.Convert());\n+  }\n+  ~FileMetaDataImpl() {}\n+  int64_t num_rows() const { return metadata_->num_rows; }\n+  int num_row_groups() const { return metadata_->row_groups.size(); }\n+  int32_t version() const { return metadata_->version; }\n+  const std::string& created_by() const { return metadata_->created_by; }\n+  int num_schema_elements() const { return metadata_->schema.size(); }\n+\n+  void WriteTo(OutputStream* dst) {\n+    SerializeThriftMsg(metadata_.get(), sizeof(format::FileMetaData), dst);\n+  }\n+\n+  std::unique_ptr<RowGroupMetaData> GetRowGroupMetaData(int i) {\n+    DCHECK(i < num_row_groups())\n+        << \"The file only has \" << num_row_groups()\n+        << \" row groups, requested metadata for row group: \" << i;\n+    return RowGroupMetaData::GetRowGroupMetaData(\n+        reinterpret_cast<const uint8_t*>(&metadata_->row_groups[i]));\n+  }\n+\n+  const SchemaDescriptor* schema() const { return &schema_; }\n+\n+ private:\n+  std::unique_ptr<const format::FileMetaData> metadata_;\n+  SchemaDescriptor schema_;\n+};\n+\n+std::unique_ptr<FileMetaData> FileMetaData::GetFileMetaData(const uint8_t* metadata) {\n+  return std::unique_ptr<FileMetaData>(new FileMetaData(metadata));\n+}\n+\n+FileMetaData::FileMetaData(const uint8_t* metadata)\n+    : impl_{std::unique_ptr<FileMetaDataImpl>(new FileMetaDataImpl(metadata))} {}\n+FileMetaData::~FileMetaData() {}\n+\n+std::unique_ptr<RowGroupMetaData> FileMetaData::GetRowGroupMetaData(int i) const {\n+  return impl_->GetRowGroupMetaData(i);\n+}\n+\n+int64_t FileMetaData::num_rows() const {\n+  return impl_->num_rows();\n+}\n+\n+int FileMetaData::num_row_groups() const {\n+  return impl_->num_row_groups();\n+}\n+\n+int32_t FileMetaData::version() const {\n+  return impl_->version();\n+}\n+\n+const std::string& FileMetaData::created_by() const {\n+  return impl_->created_by();\n+}\n+\n+int FileMetaData::num_schema_elements() const {\n+  return impl_->num_schema_elements();\n+}\n+\n+const SchemaDescriptor* FileMetaData::schema() const {\n+  return impl_->schema();\n+}\n+\n+void FileMetaData::WriteTo(OutputStream* dst) {\n+  return impl_->WriteTo(dst);\n+}\n+\n+// MetaData Builders\n+// row-group metadata\n+class ColumnMetaDataBuilder::ColumnMetaDataBuilderImpl {\n+ public:\n+  explicit ColumnMetaDataBuilderImpl(std::shared_ptr<WriterProperties> props,\n+      const ColumnDescriptor* column, uint8_t* contents)\n+      : properties_(props), column_(column) {\n+    column_chunk_ = reinterpret_cast<format::ColumnChunk*>(contents);\n+    column_chunk_->meta_data.__set_type(ToThrift(column->physical_type()));\n+    column_chunk_->meta_data.__set_path_in_schema(column->path()->ToDotVector());\n+    column_chunk_->meta_data.__set_codec(\n+        ToThrift(properties_->compression(column->path())));\n+    std::vector<format::Encoding::type> thrift_encodings;\n+    std::set<Encoding::type> encodings_set;\n+    ColumnEncodingSet encodings = properties_->encodings(column->path());\n+    encodings_set.insert(encodings.def_level_encoding);\n+    encodings_set.insert(encodings.rep_level_encoding);\n+    if (properties_->dictionary_enabled()) {\n+      encodings_set.insert(encodings.dictionary_encoding);\n+    }\n+    encodings_set.insert(encodings.value_encoding);\n+    for (auto encoding : encodings_set) {\n+      thrift_encodings.push_back(ToThrift(encoding));\n+    }\n+    column_chunk_->meta_data.__set_encodings(thrift_encodings);\n+  }\n+  ~ColumnMetaDataBuilderImpl() {}\n+\n+  // column chunk\n+  void set_file_path(const std::string& val) { column_chunk_->__set_file_path(val); }\n+\n+  // column metadata\n+  // Needed to override the original values when fallback encoding is used\n+  void SetEncodingsWithDictionaryFallback() {\n+    std::vector<format::Encoding::type> thrift_encodings;\n+    std::set<Encoding::type> encodings_set;\n+    ColumnEncodingSet encodings = properties_->encodings(column_->path());\n+    encodings_set.insert(encodings.def_level_encoding);\n+    encodings_set.insert(encodings.rep_level_encoding);\n+    if (properties_->dictionary_enabled()) {\n+      encodings_set.insert(encodings.dictionary_encoding);\n+    }\n+    encodings_set.insert(encodings.value_encoding);\n+    encodings_set.insert(encodings.dictionary_fallback_encoding);\n+    for (auto encoding : encodings_set) {\n+      thrift_encodings.push_back(ToThrift(encoding));\n+    }\n+    column_chunk_->meta_data.__set_encodings(thrift_encodings);\n+  }\n+\n+  void SetStatistics(const ColumnStatistics& val) {\n+    format::Statistics stats;\n+    stats.null_count = val.null_count;\n+    stats.distinct_count = val.distinct_count;\n+    stats.max = *val.max;\n+    stats.min = *val.min;\n+\n+    column_chunk_->meta_data.__set_statistics(stats);\n+  }\n+\n+  void Finish(int64_t num_values, int64_t dictionary_page_offset,\n+      int64_t index_page_offset, int64_t data_page_offset, int64_t compressed_size,\n+      int64_t uncompressed_size) {\n+    if (dictionary_page_offset > 0) {\n+      column_chunk_->__set_file_offset(dictionary_page_offset + compressed_size);\n+    } else {\n+      column_chunk_->__set_file_offset(data_page_offset + compressed_size);\n+    }\n+    column_chunk_->meta_data.__set_dictionary_page_offset(dictionary_page_offset);\n+    column_chunk_->meta_data.__set_index_page_offset(index_page_offset);\n+    column_chunk_->meta_data.__set_data_page_offset(data_page_offset);\n+    column_chunk_->meta_data.__set_total_uncompressed_size(uncompressed_size);\n+    column_chunk_->meta_data.__set_total_compressed_size(compressed_size);\n+  }\n+\n+ private:\n+  format::ColumnChunk* column_chunk_;\n+  std::shared_ptr<WriterProperties> properties_;","path":"src/parquet/file/metadata-internal.cc","position":339,"original_position":339,"commit_id":"81d7ac31fe0312e7d9f5386ad42af9eb63c9994d","original_commit_id":"81d7ac31fe0312e7d9f5386ad42af9eb63c9994d","user":{"login":"wesm","id":329591,"avatar_url":"https://avatars.githubusercontent.com/u/329591?v=3","gravatar_id":"","url":"https://api.github.com/users/wesm","html_url":"https://github.com/wesm","followers_url":"https://api.github.com/users/wesm/followers","following_url":"https://api.github.com/users/wesm/following{/other_user}","gists_url":"https://api.github.com/users/wesm/gists{/gist_id}","starred_url":"https://api.github.com/users/wesm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wesm/subscriptions","organizations_url":"https://api.github.com/users/wesm/orgs","repos_url":"https://api.github.com/users/wesm/repos","events_url":"https://api.github.com/users/wesm/events{/privacy}","received_events_url":"https://api.github.com/users/wesm/received_events","type":"User","site_admin":false},"body":"Does this class need to retain ownership of the properties class? ","created_at":"2016-08-29T02:59:35Z","updated_at":"2016-08-29T02:59:35Z","html_url":"https://github.com/apache/parquet-cpp/pull/143#discussion_r76548232","pull_request_url":"https://api.github.com/repos/apache/parquet-cpp/pulls/143","_links":{"self":{"href":"https://api.github.com/repos/apache/parquet-cpp/pulls/comments/76548232"},"html":{"href":"https://github.com/apache/parquet-cpp/pull/143#discussion_r76548232"},"pull_request":{"href":"https://api.github.com/repos/apache/parquet-cpp/pulls/143"}}},"pull_request":{"url":"https://api.github.com/repos/apache/parquet-cpp/pulls/143","id":81901970,"html_url":"https://github.com/apache/parquet-cpp/pull/143","diff_url":"https://github.com/apache/parquet-cpp/pull/143.diff","patch_url":"https://github.com/apache/parquet-cpp/pull/143.patch","issue_url":"https://api.github.com/repos/apache/parquet-cpp/issues/143","number":143,"state":"open","locked":false,"title":"PARQUET-573: Create a public API for reading and writing file metadata","user":{"login":"majetideepak","id":5091159,"avatar_url":"https://avatars.githubusercontent.com/u/5091159?v=3","gravatar_id":"","url":"https://api.github.com/users/majetideepak","html_url":"https://github.com/majetideepak","followers_url":"https://api.github.com/users/majetideepak/followers","following_url":"https://api.github.com/users/majetideepak/following{/other_user}","gists_url":"https://api.github.com/users/majetideepak/gists{/gist_id}","starred_url":"https://api.github.com/users/majetideepak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/majetideepak/subscriptions","organizations_url":"https://api.github.com/users/majetideepak/orgs","repos_url":"https://api.github.com/users/majetideepak/repos","events_url":"https://api.github.com/users/majetideepak/events{/privacy}","received_events_url":"https://api.github.com/users/majetideepak/received_events","type":"User","site_admin":false},"body":"This patch adds API to read and write metadata as well as improves the writer properties class.\r\nI am planning to add some comments to the code next. Meanwhile, any feedback will be helpful.","created_at":"2016-08-18T22:54:45Z","updated_at":"2016-08-29T02:59:35Z","closed_at":null,"merged_at":null,"merge_commit_sha":"bec16a64188d5102dedcc8f253fbf3b64ced0913","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/apache/parquet-cpp/pulls/143/commits","review_comments_url":"https://api.github.com/repos/apache/parquet-cpp/pulls/143/comments","review_comment_url":"https://api.github.com/repos/apache/parquet-cpp/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/parquet-cpp/issues/143/comments","statuses_url":"https://api.github.com/repos/apache/parquet-cpp/statuses/81d7ac31fe0312e7d9f5386ad42af9eb63c9994d","head":{"label":"majetideepak:metadata","ref":"metadata","sha":"81d7ac31fe0312e7d9f5386ad42af9eb63c9994d","user":{"login":"majetideepak","id":5091159,"avatar_url":"https://avatars.githubusercontent.com/u/5091159?v=3","gravatar_id":"","url":"https://api.github.com/users/majetideepak","html_url":"https://github.com/majetideepak","followers_url":"https://api.github.com/users/majetideepak/followers","following_url":"https://api.github.com/users/majetideepak/following{/other_user}","gists_url":"https://api.github.com/users/majetideepak/gists{/gist_id}","starred_url":"https://api.github.com/users/majetideepak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/majetideepak/subscriptions","organizations_url":"https://api.github.com/users/majetideepak/orgs","repos_url":"https://api.github.com/users/majetideepak/repos","events_url":"https://api.github.com/users/majetideepak/events{/privacy}","received_events_url":"https://api.github.com/users/majetideepak/received_events","type":"User","site_admin":false},"repo":{"id":49598967,"name":"parquet-cpp","full_name":"majetideepak/parquet-cpp","owner":{"login":"majetideepak","id":5091159,"avatar_url":"https://avatars.githubusercontent.com/u/5091159?v=3","gravatar_id":"","url":"https://api.github.com/users/majetideepak","html_url":"https://github.com/majetideepak","followers_url":"https://api.github.com/users/majetideepak/followers","following_url":"https://api.github.com/users/majetideepak/following{/other_user}","gists_url":"https://api.github.com/users/majetideepak/gists{/gist_id}","starred_url":"https://api.github.com/users/majetideepak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/majetideepak/subscriptions","organizations_url":"https://api.github.com/users/majetideepak/orgs","repos_url":"https://api.github.com/users/majetideepak/repos","events_url":"https://api.github.com/users/majetideepak/events{/privacy}","received_events_url":"https://api.github.com/users/majetideepak/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/majetideepak/parquet-cpp","description":"Mirror of Apache Parquet","fork":true,"url":"https://api.github.com/repos/majetideepak/parquet-cpp","forks_url":"https://api.github.com/repos/majetideepak/parquet-cpp/forks","keys_url":"https://api.github.com/repos/majetideepak/parquet-cpp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/majetideepak/parquet-cpp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/majetideepak/parquet-cpp/teams","hooks_url":"https://api.github.com/repos/majetideepak/parquet-cpp/hooks","issue_events_url":"https://api.github.com/repos/majetideepak/parquet-cpp/issues/events{/number}","events_url":"https://api.github.com/repos/majetideepak/parquet-cpp/events","assignees_url":"https://api.github.com/repos/majetideepak/parquet-cpp/assignees{/user}","branches_url":"https://api.github.com/repos/majetideepak/parquet-cpp/branches{/branch}","tags_url":"https://api.github.com/repos/majetideepak/parquet-cpp/tags","blobs_url":"https://api.github.com/repos/majetideepak/parquet-cpp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/majetideepak/parquet-cpp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/majetideepak/parquet-cpp/git/refs{/sha}","trees_url":"https://api.github.com/repos/majetideepak/parquet-cpp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/majetideepak/parquet-cpp/statuses/{sha}","languages_url":"https://api.github.com/repos/majetideepak/parquet-cpp/languages","stargazers_url":"https://api.github.com/repos/majetideepak/parquet-cpp/stargazers","contributors_url":"https://api.github.com/repos/majetideepak/parquet-cpp/contributors","subscribers_url":"https://api.github.com/repos/majetideepak/parquet-cpp/subscribers","subscription_url":"https://api.github.com/repos/majetideepak/parquet-cpp/subscription","commits_url":"https://api.github.com/repos/majetideepak/parquet-cpp/commits{/sha}","git_commits_url":"https://api.github.com/repos/majetideepak/parquet-cpp/git/commits{/sha}","comments_url":"https://api.github.com/repos/majetideepak/parquet-cpp/comments{/number}","issue_comment_url":"https://api.github.com/repos/majetideepak/parquet-cpp/issues/comments{/number}","contents_url":"https://api.github.com/repos/majetideepak/parquet-cpp/contents/{+path}","compare_url":"https://api.github.com/repos/majetideepak/parquet-cpp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/majetideepak/parquet-cpp/merges","archive_url":"https://api.github.com/repos/majetideepak/parquet-cpp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/majetideepak/parquet-cpp/downloads","issues_url":"https://api.github.com/repos/majetideepak/parquet-cpp/issues{/number}","pulls_url":"https://api.github.com/repos/majetideepak/parquet-cpp/pulls{/number}","milestones_url":"https://api.github.com/repos/majetideepak/parquet-cpp/milestones{/number}","notifications_url":"https://api.github.com/repos/majetideepak/parquet-cpp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/majetideepak/parquet-cpp/labels{/name}","releases_url":"https://api.github.com/repos/majetideepak/parquet-cpp/releases{/id}","deployments_url":"https://api.github.com/repos/majetideepak/parquet-cpp/deployments","created_at":"2016-01-13T20:12:53Z","updated_at":"2016-03-17T14:07:22Z","pushed_at":"2016-08-29T01:09:41Z","git_url":"git://github.com/majetideepak/parquet-cpp.git","ssh_url":"git@github.com:majetideepak/parquet-cpp.git","clone_url":"https://github.com/majetideepak/parquet-cpp.git","svn_url":"https://github.com/majetideepak/parquet-cpp","homepage":null,"size":984,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"0a0323d850a00f168b5e6e2b51df607d63323846","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":20675634,"name":"parquet-cpp","full_name":"apache/parquet-cpp","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/parquet-cpp","description":"Mirror of Apache Parquet","fork":false,"url":"https://api.github.com/repos/apache/parquet-cpp","forks_url":"https://api.github.com/repos/apache/parquet-cpp/forks","keys_url":"https://api.github.com/repos/apache/parquet-cpp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/parquet-cpp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/parquet-cpp/teams","hooks_url":"https://api.github.com/repos/apache/parquet-cpp/hooks","issue_events_url":"https://api.github.com/repos/apache/parquet-cpp/issues/events{/number}","events_url":"https://api.github.com/repos/apache/parquet-cpp/events","assignees_url":"https://api.github.com/repos/apache/parquet-cpp/assignees{/user}","branches_url":"https://api.github.com/repos/apache/parquet-cpp/branches{/branch}","tags_url":"https://api.github.com/repos/apache/parquet-cpp/tags","blobs_url":"https://api.github.com/repos/apache/parquet-cpp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/parquet-cpp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/parquet-cpp/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/parquet-cpp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/parquet-cpp/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/parquet-cpp/languages","stargazers_url":"https://api.github.com/repos/apache/parquet-cpp/stargazers","contributors_url":"https://api.github.com/repos/apache/parquet-cpp/contributors","subscribers_url":"https://api.github.com/repos/apache/parquet-cpp/subscribers","subscription_url":"https://api.github.com/repos/apache/parquet-cpp/subscription","commits_url":"https://api.github.com/repos/apache/parquet-cpp/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/parquet-cpp/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/parquet-cpp/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/parquet-cpp/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/parquet-cpp/contents/{+path}","compare_url":"https://api.github.com/repos/apache/parquet-cpp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/parquet-cpp/merges","archive_url":"https://api.github.com/repos/apache/parquet-cpp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/parquet-cpp/downloads","issues_url":"https://api.github.com/repos/apache/parquet-cpp/issues{/number}","pulls_url":"https://api.github.com/repos/apache/parquet-cpp/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/parquet-cpp/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/parquet-cpp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/parquet-cpp/labels{/name}","releases_url":"https://api.github.com/repos/apache/parquet-cpp/releases{/id}","deployments_url":"https://api.github.com/repos/apache/parquet-cpp/deployments","created_at":"2014-06-10T07:00:07Z","updated_at":"2016-08-26T14:31:27Z","pushed_at":"2016-08-29T01:09:41Z","git_url":"git://github.com/apache/parquet-cpp.git","ssh_url":"git@github.com:apache/parquet-cpp.git","clone_url":"https://github.com/apache/parquet-cpp.git","svn_url":"https://github.com/apache/parquet-cpp","homepage":null,"size":1471,"stargazers_count":66,"watchers_count":66,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":37,"mirror_url":"git://git.apache.org/parquet-cpp.git","open_issues_count":4,"forks":37,"open_issues":4,"watchers":66,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/parquet-cpp/pulls/143"},"html":{"href":"https://github.com/apache/parquet-cpp/pull/143"},"issue":{"href":"https://api.github.com/repos/apache/parquet-cpp/issues/143"},"comments":{"href":"https://api.github.com/repos/apache/parquet-cpp/issues/143/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/parquet-cpp/pulls/143/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/parquet-cpp/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/parquet-cpp/pulls/143/commits"},"statuses":{"href":"https://api.github.com/repos/apache/parquet-cpp/statuses/81d7ac31fe0312e7d9f5386ad42af9eb63c9994d"}}}}
{"actor":{"display_login":"wesm"}}