{"action":"created","comment":{"url":"https://api.github.com/repos/apache/parquet-cpp/pulls/comments/75790674","id":75790674,"diff_hunk":"@@ -0,0 +1,650 @@\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/thrift/util.h\"\n+\n+#define VALIDATE_COLUMN(X)                                               \\\n+  DCHECK(X < num_columns()) << \"The RowGroup only has \" << num_columns() \\\n+                            << \"columns, requested column: \" << X;\n+\n+namespace parquet {\n+\n+namespace metadata {\n+\n+// MetaDataReaders\n+// schema metadata\n+class SchemaMetaDataReader::InternalSchemaMetaDataReader {\n+ public:\n+  explicit InternalSchemaMetaDataReader(const format::SchemaElement* schema)\n+      : schema_(schema) {}\n+  ~InternalSchemaMetaDataReader() {}\n+  Type::type PhysicalType() const { return FromThrift(schema_->type); }\n+  int32_t type_length() const { return schema_->type_length; }\n+  int32_t num_children() const { return schema_->num_children; }\n+  int32_t scale() const { return schema_->scale; }\n+  int32_t precision() const { return schema_->precision; }\n+  int32_t field_id() const { return schema_->field_id; }\n+  const std::string& name() const { return schema_->name; }\n+  LogicalType::type ConvertedType() const { return FromThrift(schema_->converted_type); }\n+  Repetition::type RepetitionType() const { return FromThrift(schema_->repetition_type); }\n+\n+ private:\n+  const format::SchemaElement* schema_;\n+};\n+\n+std::unique_ptr<SchemaMetaDataReader> SchemaMetaDataReader::GetSchemaMetaDataReader(\n+    const uint8_t* metadata) {\n+  return std::unique_ptr<SchemaMetaDataReader>(new SchemaMetaDataReader(metadata));\n+}\n+\n+SchemaMetaDataReader::SchemaMetaDataReader(const uint8_t* metadata)\n+    : impl{std::unique_ptr<InternalSchemaMetaDataReader>(new InternalSchemaMetaDataReader(\n+          reinterpret_cast<const format::SchemaElement*>(metadata)))} {}\n+SchemaMetaDataReader::~SchemaMetaDataReader() {}\n+\n+Type::type SchemaMetaDataReader::PhysicalType() const {\n+  return impl->PhysicalType();\n+}\n+\n+int32_t SchemaMetaDataReader::type_length() const {\n+  return impl->type_length();\n+}\n+\n+int32_t SchemaMetaDataReader::num_children() const {\n+  return impl->num_children();\n+}\n+\n+int32_t SchemaMetaDataReader::scale() const {\n+  return impl->scale();\n+}\n+\n+int32_t SchemaMetaDataReader::precision() const {\n+  return impl->precision();\n+}\n+\n+int32_t SchemaMetaDataReader::field_id() const {\n+  return impl->field_id();\n+}\n+\n+const std::string& SchemaMetaDataReader::name() const {\n+  return impl->name();\n+}\n+\n+LogicalType::type SchemaMetaDataReader::ConvertedType() const {\n+  return impl->ConvertedType();\n+}\n+\n+Repetition::type SchemaMetaDataReader::RepetitionType() const {\n+  return impl->RepetitionType();\n+}\n+\n+// row-group metadata\n+class RowGroupMetaDataReader::InternalRowGroupMetaDataReader {\n+ public:\n+  explicit InternalRowGroupMetaDataReader(const format::RowGroup* row_group)\n+      : row_group_(row_group) {}\n+  ~InternalRowGroupMetaDataReader() {}\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+  // column chunk\n+  int64_t column_file_offset(int i) const { return row_group_->columns[i].file_offset; }\n+  const std::string& column_file_path(int i) const {\n+    return row_group_->columns[i].file_path;\n+  }\n+\n+  // column metadata\n+  Type::type column_type(int i) {\n+    return FromThrift(row_group_->columns[i].meta_data.type);\n+  }\n+\n+  int64_t num_values(int i) const { return row_group_->columns[i].meta_data.num_values; }\n+  const std::shared_ptr<schema::ColumnPath> column_path_in_schema(int i) {\n+    return std::make_shared<schema::ColumnPath>(\n+        row_group_->columns[i].meta_data.path_in_schema);\n+  }\n+\n+  bool IsColumnStatsSet(int i) const {\n+    VALIDATE_COLUMN(i);\n+    return row_group_->columns[i].meta_data.__isset.statistics;\n+  }\n+\n+  ColumnStatistics GetColumnStats(int i) const {\n+    VALIDATE_COLUMN(i);\n+    const format::ColumnMetaData& meta_data = row_group_->columns[i].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 GetColumnCompression(int i) const {\n+    VALIDATE_COLUMN(i);\n+    return FromThrift(row_group_->columns[i].meta_data.codec);\n+  }\n+\n+  std::vector<Encoding::type> GetColumnEncodings(int i) const {\n+    VALIDATE_COLUMN(i);\n+    const format::ColumnMetaData& meta_data = row_group_->columns[i].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 GetColumnCompressedSize(int i) const {\n+    VALIDATE_COLUMN(i);\n+    return row_group_->columns[i].meta_data.total_uncompressed_size;\n+  }\n+\n+  int64_t GetColumnUnCompressedSize(int i) const {\n+    VALIDATE_COLUMN(i);\n+    return row_group_->columns[i].meta_data.total_compressed_size;\n+  }\n+\n+ private:\n+  const format::RowGroup* row_group_;\n+};\n+\n+std::unique_ptr<RowGroupMetaDataReader> RowGroupMetaDataReader::GetRowGroupMetaDataReader(\n+    const uint8_t* metadata) {\n+  return std::unique_ptr<RowGroupMetaDataReader>(new RowGroupMetaDataReader(metadata));\n+}\n+\n+RowGroupMetaDataReader::RowGroupMetaDataReader(const uint8_t* metadata)\n+    : impl{std::unique_ptr<InternalRowGroupMetaDataReader>(\n+          new InternalRowGroupMetaDataReader(\n+              reinterpret_cast<const format::RowGroup*>(metadata)))} {}\n+RowGroupMetaDataReader::~RowGroupMetaDataReader() {}\n+\n+int RowGroupMetaDataReader::num_columns() const {\n+  return impl->num_columns();\n+}\n+\n+int64_t RowGroupMetaDataReader::num_rows() const {\n+  return impl->num_rows();\n+}\n+\n+int64_t RowGroupMetaDataReader::total_byte_size() const {\n+  return impl->total_byte_size();\n+}\n+// column chunk\n+int64_t RowGroupMetaDataReader::column_file_offset(int i) const {\n+  return impl->column_file_offset(i);\n+}\n+\n+const std::string& RowGroupMetaDataReader::column_file_path(int i) const {\n+  return impl->column_file_path(i);\n+}\n+\n+// column metadata\n+Type::type RowGroupMetaDataReader::column_type(int i) const {\n+  return impl->column_type(i);\n+}\n+\n+int64_t RowGroupMetaDataReader::num_values(int i) const {\n+  return impl->num_values(i);\n+}\n+\n+const std::shared_ptr<schema::ColumnPath> RowGroupMetaDataReader::column_path_in_schema(\n+    int i) const {\n+  return impl->column_path_in_schema(i);\n+}\n+\n+ColumnStatistics RowGroupMetaDataReader::GetColumnStats(int i) const {\n+  return impl->GetColumnStats(i);\n+}\n+\n+bool RowGroupMetaDataReader::IsColumnStatsSet(int i) const {\n+  return impl->IsColumnStatsSet(i);\n+}\n+\n+Compression::type RowGroupMetaDataReader::GetColumnCompression(int i) const {\n+  return impl->GetColumnCompression(i);\n+}\n+\n+std::vector<Encoding::type> RowGroupMetaDataReader::GetColumnEncodings(int i) const {\n+  return impl->GetColumnEncodings(i);\n+}\n+\n+int64_t RowGroupMetaDataReader::GetColumnUnCompressedSize(int i) const {\n+  return impl->GetColumnUnCompressedSize(i);\n+}\n+\n+int64_t RowGroupMetaDataReader::GetColumnCompressedSize(int i) const {\n+  return impl->GetColumnCompressedSize(i);\n+}\n+\n+// file metadata\n+class FileMetaDataReader::InternalFileMetaDataReader {\n+ public:\n+  explicit InternalFileMetaDataReader(const format::FileMetaData* metadata)\n+      : metadata_(metadata) {}\n+  ~InternalFileMetaDataReader() {}\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+  std::unique_ptr<SchemaMetaDataReader> GetSchemaMetaDataReader(int i) {\n+    DCHECK(i < num_schema_elements()) << \"The file only has \" << num_schema_elements()\n+                                      << \" schema elements, requested metadata: \" << i;\n+    return std::unique_ptr<SchemaMetaDataReader>(new SchemaMetaDataReader(\n+        reinterpret_cast<const uint8_t*>(&metadata_->schema[i])));\n+  }\n+\n+  std::unique_ptr<RowGroupMetaDataReader> GetRowGroupMetaDataReader(int i) {\n+    DCHECK(i < num_row_groups()) << \"The file only has \" << num_row_groups()\n+                                 << \"row groups, requested metadata: \" << i;\n+    return std::unique_ptr<RowGroupMetaDataReader>(new RowGroupMetaDataReader(\n+        reinterpret_cast<const uint8_t*>(&metadata_->row_groups[i])));\n+  }\n+\n+ private:\n+  const format::FileMetaData* metadata_;\n+};\n+\n+std::unique_ptr<FileMetaDataReader> FileMetaDataReader::GetFileMetaDataReader(\n+    const uint8_t* metadata) {\n+  return std::unique_ptr<FileMetaDataReader>(new FileMetaDataReader(metadata));\n+}\n+\n+FileMetaDataReader::FileMetaDataReader(const uint8_t* metadata)\n+    : impl{std::unique_ptr<InternalFileMetaDataReader>(new InternalFileMetaDataReader(\n+          reinterpret_cast<const format::FileMetaData*>(metadata)))} {}\n+FileMetaDataReader::~FileMetaDataReader() {}\n+\n+std::unique_ptr<RowGroupMetaDataReader> FileMetaDataReader::GetRowGroupMetaDataReader(\n+    int i) const {\n+  return impl->GetRowGroupMetaDataReader(i);\n+}\n+\n+std::unique_ptr<SchemaMetaDataReader> FileMetaDataReader::GetSchemaMetaDataReader(\n+    int i) const {\n+  return impl->GetSchemaMetaDataReader(i);\n+}\n+\n+int64_t FileMetaDataReader::num_rows() const {\n+  return impl->num_rows();\n+}\n+\n+int FileMetaDataReader::num_row_groups() const {\n+  return impl->num_row_groups();\n+}\n+\n+int32_t FileMetaDataReader::version() const {\n+  return impl->version();\n+}\n+\n+const std::string& FileMetaDataReader::created_by() const {\n+  return impl->created_by();\n+}\n+\n+int FileMetaDataReader::num_schema_elements() const {\n+  return impl->num_schema_elements();\n+}\n+\n+// MetaDataWriters\n+// Update row-group Columns\n+class SchemaMetaDataWriter::InternalSchemaMetaDataWriter {\n+ public:\n+  InternalSchemaMetaDataWriter() {}\n+  ~InternalSchemaMetaDataWriter() {}\n+  // Schema metadata\n+  void PhysicalType(Type::type val) { schema_.__set_type(ToThrift(val)); }\n+  void type_length(int32_t val) { schema_.__set_type_length(val); }\n+  void num_children(int32_t val) { schema_.__set_num_children(val); }\n+  void scale(int32_t val) { schema_.__set_scale(val); }\n+  void precision(int32_t val) { schema_.__set_precision(val); }\n+  void field_id(int32_t val) { schema_.__set_field_id(val); }\n+  void name(const std::string& val) { schema_.__set_name(val); }\n+  void ConvertedType(LogicalType::type val) {\n+    schema_.__set_converted_type(ToThrift(val));\n+  }\n+  void RepetitionType(Repetition::type val) {\n+    schema_.__set_repetition_type(ToThrift(val));\n+  }\n+  const uint8_t* get_buffer() { return reinterpret_cast<const uint8_t*>(&schema_); }\n+  size_t get_buffer_size() { return sizeof(schema_); }\n+\n+ private:\n+  format::SchemaElement schema_;\n+};\n+\n+std::unique_ptr<SchemaMetaDataWriter> SchemaMetaDataWriter::GetSchemaMetaDataWriter() {\n+  return std::unique_ptr<SchemaMetaDataWriter>(new SchemaMetaDataWriter());\n+}\n+\n+SchemaMetaDataWriter::SchemaMetaDataWriter()\n+    : impl{std::unique_ptr<InternalSchemaMetaDataWriter>(\n+          new InternalSchemaMetaDataWriter())} {}\n+\n+SchemaMetaDataWriter::~SchemaMetaDataWriter() {}\n+\n+const uint8_t* SchemaMetaDataWriter::get_buffer() {\n+  return impl->get_buffer();\n+}\n+\n+size_t SchemaMetaDataWriter::get_buffer_size() {\n+  return impl->get_buffer_size();\n+}\n+\n+// schema metadata\n+void SchemaMetaDataWriter::PhysicalType(Type::type val) {\n+  impl->PhysicalType(val);\n+}\n+\n+void SchemaMetaDataWriter::type_length(int32_t val) {\n+  impl->type_length(val);\n+}\n+\n+void SchemaMetaDataWriter::num_children(int32_t val) {\n+  impl->num_children(val);\n+}\n+\n+void SchemaMetaDataWriter::scale(int32_t val) {\n+  impl->scale(val);\n+}\n+\n+void SchemaMetaDataWriter::precision(int32_t val) {\n+  impl->precision(val);\n+}\n+\n+void SchemaMetaDataWriter::field_id(int32_t val) {\n+  impl->field_id(val);\n+}\n+\n+void SchemaMetaDataWriter::name(const std::string& val) {\n+  impl->name(val);\n+}\n+\n+void SchemaMetaDataWriter::ConvertedType(LogicalType::type val) {\n+  impl->ConvertedType(val);\n+}\n+\n+void SchemaMetaDataWriter::RepetitionType(Repetition::type val) {\n+  impl->RepetitionType(val);\n+}\n+\n+// row-group metadata\n+class RowGroupMetaDataWriter::InternalRowGroupMetaDataWriter {\n+ public:\n+  explicit InternalRowGroupMetaDataWriter(const WriterProperties& props)\n+      : properties_(props), num_columns_(0) {}\n+  ~InternalRowGroupMetaDataWriter() {}\n+\n+  void initialize_columns(int ncols) {\n+    num_columns_ = ncols;\n+    std::vector<format::ColumnChunk> val;\n+    format::ColumnChunk col_chunk;\n+    format::ColumnMetaData meta_data;\n+    col_chunk.__set_meta_data(meta_data);\n+    for (int i = 0; i < ncols; i++) {\n+      val.push_back(col_chunk);\n+    }\n+    row_group_.__set_columns(val);\n+  }","path":"src/parquet/file/metadata-internal.cc","position":412,"original_position":412,"commit_id":"8022200de36a09019b51e37b54ab67559f4fbc6d","original_commit_id":"8022200de36a09019b51e37b54ab67559f4fbc6d","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":"Per comments elsewhere, we should think about the builder-ish API","created_at":"2016-08-23T01:39:05Z","updated_at":"2016-08-23T01:39:05Z","html_url":"https://github.com/apache/parquet-cpp/pull/143#discussion_r75790674","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/75790674"},"html":{"href":"https://github.com/apache/parquet-cpp/pull/143#discussion_r75790674"},"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-23T01:39:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"eb2e83659c6b02156d04918865fbc61e262b79db","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/8022200de36a09019b51e37b54ab67559f4fbc6d","head":{"label":"majetideepak:metadata","ref":"metadata","sha":"8022200de36a09019b51e37b54ab67559f4fbc6d","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-22T21:14:30Z","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":999,"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":"c2e5f08cbefc3326535ef0ee99812b5123754d37","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-18T15:05:30Z","pushed_at":"2016-08-22T21:14:30Z","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":1418,"stargazers_count":63,"watchers_count":63,"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":63,"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/8022200de36a09019b51e37b54ab67559f4fbc6d"}}}}
{"actor":{"display_login":"wesm"}}