{"action":"created","comment":{"url":"https://api.github.com/repos/apache/parquet-cpp/pulls/comments/53530716","id":53530716,"diff_hunk":"@@ -0,0 +1,386 @@\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 <cstdint>\n+#include <cstdlib>\n+#include <list>\n+#include <vector>\n+#include <limits>\n+\n+#include <gtest/gtest.h>\n+\n+#include \"parquet/types.h\"\n+#include \"parquet/column/page.h\"\n+#include \"parquet/column/reader.h\"\n+#include \"parquet/column/scanner.h\"\n+#include \"parquet/column/test-util.h\"\n+\n+#include \"parquet/util/test-common.h\"\n+\n+namespace parquet_cpp {\n+\n+using schema::NodePtr;\n+\n+bool operator==(const Int96 a, const Int96 b) {\n+  return a.value[0] == b.value[0] &&\n+         a.value[1] == b.value[1] &&\n+         a.value[2] == b.value[2];\n+}\n+\n+bool operator==(const ByteArray a, const ByteArray b) {\n+  return a.len == b.len && 0 == memcmp(a.ptr, a.ptr, a.len);\n+}\n+\n+static int FLBA_LENGTH = 8;\n+bool operator==(const FixedLenByteArray a, const FixedLenByteArray b) {\n+  return 0 == memcmp(a.ptr, a.ptr, FLBA_LENGTH);\n+}\n+\n+namespace test {\n+\n+template <int TYPE>\n+class TestFlatScanner : public ::testing::Test {\n+ public:\n+  void SetUp() {\n+    values_.resize(0);\n+    std::random_device rd;\n+    SEED = rd();\n+  }\n+\n+  void TearDown() {}\n+\n+  typedef typename type_traits<TYPE>::value_type T;\n+\n+  void InitScanner(Repetition::type rep,\n+      int16_t max_def_level = 0, int16_t max_rep_level = 0) {\n+    NodePtr type = schema::PrimitiveNode::Make(\"c1\", rep, static_cast<Type::type>(TYPE));\n+    descr_.reset(new ColumnDescriptor(type, max_def_level, max_rep_level));\n+\n+    std::unique_ptr<PageReader> pager(new test::MockPageReader(pages_));\n+    scanner_ = Scanner::Make(ColumnReader::Make(descr_.get(), std::move(pager)));\n+  }\n+\n+ protected:\n+  void AddPages(size_t pages, size_t num_values,\n+      std::vector<int16_t> def_levels, int16_t max_def_level,\n+      std::vector<int16_t> rep_levels, int16_t max_rep_level) {\n+    size_t page_size = std::max(def_levels.size(), num_values);\n+    std::vector<T> page(num_values);\n+    for (size_t i = 0; i < pages; i++) {\n+      random_numbers(num_values, SEED, &page[0]);\n+      buffers.push_back(std::vector<uint8_t>());\n+      pages_.push_back(\n+          MakeDataPage<TYPE>(page, def_levels, max_def_level,\n+              rep_levels, max_rep_level, &buffers.back()));\n+      values_.insert(values_.end(), page.begin(), page.end());\n+    }\n+  }\n+\n+  void VerifyOutput(size_t total_values) {\n+    TypedScanner<TYPE>* scanner = reinterpret_cast<TypedScanner<TYPE>* >(scanner_.get());\n+    T val;\n+    bool is_null;\n+    size_t j = 0;\n+    for (size_t i = 0; i < total_values; i++) {\n+      ASSERT_TRUE(scanner->HasNext());\n+      ASSERT_TRUE(scanner->NextValue(&val, &is_null));\n+      if (!is_null)\n+        ASSERT_EQ(values_[j++], val);\n+    }\n+    ASSERT_FALSE(scanner->HasNext());\n+  }\n+\n+  std::list< std::vector<uint8_t> > buffers;\n+  std::unique_ptr<ColumnDescriptor> descr_;\n+  std::vector< std::shared_ptr<Page> > pages_;\n+  std::shared_ptr<Scanner> scanner_;\n+  std::vector<T> values_;\n+  std::vector<uint8_t> data_buffer_; // For BA and FLBA\n+\n+  uint32_t SEED;\n+  uint32_t PAGES = 4;\n+};\n+\n+template <>\n+void TestFlatScanner<Type::BOOLEAN>::AddPages(size_t pages, size_t num_values,\n+    std::vector<int16_t> def_levels, int16_t max_def_level,\n+    std::vector<int16_t> rep_levels, int16_t max_rep_level) {\n+  size_t page_size = std::max(def_levels.size(), num_values);\n+  std::vector<bool> page;\n+  for (size_t i = 0; i < pages; i++) {\n+    page = flip_coins(num_values, 0.5);\n+    buffers.push_back(std::vector<uint8_t>());\n+    pages_.push_back(\n+        MakeDataPage<Type::BOOLEAN>(page, def_levels, max_def_level,\n+            rep_levels, max_rep_level, &buffers.back()));\n+    values_.insert(values_.end(), page.begin(), page.end());\n+  }\n+}\n+\n+template <>\n+void TestFlatScanner<Type::BYTE_ARRAY>::AddPages(size_t pages, size_t num_values,\n+    std::vector<int16_t> def_levels, int16_t max_def_level,\n+    std::vector<int16_t> rep_levels, int16_t max_rep_level) {\n+  int max_byte_array_len = 12 + sizeof(uint32_t);\n+  size_t nbytes = num_values * max_byte_array_len;\n+  data_buffer_.resize(nbytes);\n+\n+  size_t page_size = std::max(def_levels.size(), num_values);\n+  std::vector<ByteArray> page(num_values);\n+  for (size_t i = 0; i < pages; i++) {\n+    random_byte_array(num_values, 0.5, data_buffer_.data(), page, max_byte_array_len);\n+    buffers.push_back(std::vector<uint8_t>());\n+    pages_.push_back(\n+        MakeDataPage<Type::BYTE_ARRAY>(page, def_levels, max_def_level,\n+            rep_levels, max_rep_level, &buffers.back()));\n+    values_.insert(values_.end(), page.begin(), page.end());\n+  }\n+}\n+\n+template <>\n+void TestFlatScanner<Type::FIXED_LEN_BYTE_ARRAY>::AddPages(\n+    size_t pages, size_t num_values,\n+    std::vector<int16_t> def_levels, int16_t max_def_level,\n+    std::vector<int16_t> rep_levels, int16_t max_rep_level) {\n+  size_t nbytes = num_values * FLBA_LENGTH;\n+  data_buffer_.resize(nbytes);\n+\n+  size_t page_size = std::max(def_levels.size(), num_values);\n+  std::vector<FixedLenByteArray> page(num_values);\n+  for (size_t i = 0; i < pages; i++) {\n+    random_fixed_byte_array(num_values, 0.5, data_buffer_.data(), FLBA_LENGTH, page);\n+    buffers.push_back(std::vector<uint8_t>());\n+    pages_.push_back(\n+        MakeDataPage<Type::FIXED_LEN_BYTE_ARRAY>(page, def_levels, max_def_level,\n+            rep_levels, max_rep_level, &buffers.back(), FLBA_LENGTH));\n+    values_.insert(values_.end(), page.begin(), page.end());\n+  }\n+}\n+\n+template <>\n+void TestFlatScanner<Type::FIXED_LEN_BYTE_ARRAY>::InitScanner(Repetition::type rep,\n+    int16_t max_def_level, int16_t max_rep_level) {\n+  NodePtr type = schema::PrimitiveNode::MakeFLBA(\n+      \"c1\", rep, FLBA_LENGTH, LogicalType::UTF8);\n+  descr_.reset(new ColumnDescriptor(type, max_def_level, max_rep_level));\n+\n+  std::unique_ptr<PageReader> pager(new test::MockPageReader(pages_));\n+  scanner_ = Scanner::Make(ColumnReader::Make(descr_.get(), std::move(pager)));\n+}\n+\n+typedef TestFlatScanner<Type::INT32> TestFlatInt32Scanner;\n+typedef TestFlatScanner<Type::INT64> TestFlatInt64Scanner;\n+typedef TestFlatScanner<Type::INT96> TestFlatInt96Scanner;\n+typedef TestFlatScanner<Type::BOOLEAN> TestFlatBoolScanner;\n+typedef TestFlatScanner<Type::FLOAT> TestFlatFloatScanner;\n+typedef TestFlatScanner<Type::DOUBLE> TestFlatDoubleScanner;\n+typedef TestFlatScanner<Type::BYTE_ARRAY> TestFlatByteArrayScanner;\n+typedef TestFlatScanner<Type::FIXED_LEN_BYTE_ARRAY> TestFlatFLBAScanner;\n+\n+\n+TEST_F(TestFlatInt32Scanner, TestBatchSize) {\n+  AddPages(PAGES, 1000, {}, 0, {}, 0);\n+  InitScanner(Repetition::REQUIRED);\n+\n+  ASSERT_EQ(DEFAULT_SCANNER_BATCH_SIZE, scanner_->batch_size());\n+\n+  scanner_->SetBatchSize(1);\n+  ASSERT_EQ(1, scanner_->batch_size());\n+\n+  scanner_->SetBatchSize(1000000);\n+  ASSERT_EQ(1000000, scanner_->batch_size());\n+}\n+\n+// PARQUET-502\n+TEST_F(TestFlatFLBAScanner, TestSmallBatch) {\n+  AddPages(PAGES, 1000, {}, 0, {}, 0);\n+  InitScanner(Repetition::REQUIRED);\n+  scanner_->SetBatchSize(1);\n+  VerifyOutput(PAGES * 1000);\n+}","path":"src/parquet/column/scanner-test.cc","position":214,"original_position":214,"commit_id":"261e21f2246e082c5933382662351aa7ff1b5f1b","original_commit_id":"261e21f2246e082c5933382662351aa7ff1b5f1b","user":{"login":"asandryh","id":9371145,"avatar_url":"https://avatars.githubusercontent.com/u/9371145?v=3","gravatar_id":"","url":"https://api.github.com/users/asandryh","html_url":"https://github.com/asandryh","followers_url":"https://api.github.com/users/asandryh/followers","following_url":"https://api.github.com/users/asandryh/following{/other_user}","gists_url":"https://api.github.com/users/asandryh/gists{/gist_id}","starred_url":"https://api.github.com/users/asandryh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/asandryh/subscriptions","organizations_url":"https://api.github.com/users/asandryh/orgs","repos_url":"https://api.github.com/users/asandryh/repos","events_url":"https://api.github.com/users/asandryh/events{/privacy}","received_events_url":"https://api.github.com/users/asandryh/received_events","type":"User","site_admin":false},"body":"Unit test for PARQUET-502","created_at":"2016-02-19T22:55:46Z","updated_at":"2016-02-19T22:55:46Z","html_url":"https://github.com/apache/parquet-cpp/pull/50#discussion_r53530716","pull_request_url":"https://api.github.com/repos/apache/parquet-cpp/pulls/50","_links":{"self":{"href":"https://api.github.com/repos/apache/parquet-cpp/pulls/comments/53530716"},"html":{"href":"https://github.com/apache/parquet-cpp/pull/50#discussion_r53530716"},"pull_request":{"href":"https://api.github.com/repos/apache/parquet-cpp/pulls/50"}}},"pull_request":{"url":"https://api.github.com/repos/apache/parquet-cpp/pulls/50","id":59299804,"html_url":"https://github.com/apache/parquet-cpp/pull/50","diff_url":"https://github.com/apache/parquet-cpp/pull/50.diff","patch_url":"https://github.com/apache/parquet-cpp/pull/50.patch","issue_url":"https://api.github.com/repos/apache/parquet-cpp/issues/50","number":50,"state":"open","locked":false,"title":"PARQUET-526: Add unit tests for Scanner.","user":{"login":"asandryh","id":9371145,"avatar_url":"https://avatars.githubusercontent.com/u/9371145?v=3","gravatar_id":"","url":"https://api.github.com/users/asandryh","html_url":"https://github.com/asandryh","followers_url":"https://api.github.com/users/asandryh/followers","following_url":"https://api.github.com/users/asandryh/following{/other_user}","gists_url":"https://api.github.com/users/asandryh/gists{/gist_id}","starred_url":"https://api.github.com/users/asandryh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/asandryh/subscriptions","organizations_url":"https://api.github.com/users/asandryh/orgs","repos_url":"https://api.github.com/users/asandryh/repos","events_url":"https://api.github.com/users/asandryh/events{/privacy}","received_events_url":"https://api.github.com/users/asandryh/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-02-14T16:57:48Z","updated_at":"2016-02-19T22:55:46Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6c4b4ebf1fe68321c955a3e70c6c12c693ca076f","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/apache/parquet-cpp/pulls/50/commits","review_comments_url":"https://api.github.com/repos/apache/parquet-cpp/pulls/50/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/50/comments","statuses_url":"https://api.github.com/repos/apache/parquet-cpp/statuses/261e21f2246e082c5933382662351aa7ff1b5f1b","head":{"label":"asandryh:PARQUET-526","ref":"PARQUET-526","sha":"261e21f2246e082c5933382662351aa7ff1b5f1b","user":{"login":"asandryh","id":9371145,"avatar_url":"https://avatars.githubusercontent.com/u/9371145?v=3","gravatar_id":"","url":"https://api.github.com/users/asandryh","html_url":"https://github.com/asandryh","followers_url":"https://api.github.com/users/asandryh/followers","following_url":"https://api.github.com/users/asandryh/following{/other_user}","gists_url":"https://api.github.com/users/asandryh/gists{/gist_id}","starred_url":"https://api.github.com/users/asandryh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/asandryh/subscriptions","organizations_url":"https://api.github.com/users/asandryh/orgs","repos_url":"https://api.github.com/users/asandryh/repos","events_url":"https://api.github.com/users/asandryh/events{/privacy}","received_events_url":"https://api.github.com/users/asandryh/received_events","type":"User","site_admin":false},"repo":{"id":49589400,"name":"parquet-cpp","full_name":"asandryh/parquet-cpp","owner":{"login":"asandryh","id":9371145,"avatar_url":"https://avatars.githubusercontent.com/u/9371145?v=3","gravatar_id":"","url":"https://api.github.com/users/asandryh","html_url":"https://github.com/asandryh","followers_url":"https://api.github.com/users/asandryh/followers","following_url":"https://api.github.com/users/asandryh/following{/other_user}","gists_url":"https://api.github.com/users/asandryh/gists{/gist_id}","starred_url":"https://api.github.com/users/asandryh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/asandryh/subscriptions","organizations_url":"https://api.github.com/users/asandryh/orgs","repos_url":"https://api.github.com/users/asandryh/repos","events_url":"https://api.github.com/users/asandryh/events{/privacy}","received_events_url":"https://api.github.com/users/asandryh/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/asandryh/parquet-cpp","description":"Mirror of Apache Parquet","fork":true,"url":"https://api.github.com/repos/asandryh/parquet-cpp","forks_url":"https://api.github.com/repos/asandryh/parquet-cpp/forks","keys_url":"https://api.github.com/repos/asandryh/parquet-cpp/keys{/key_id}","collaborators_url":"https://api.github.com/repos/asandryh/parquet-cpp/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/asandryh/parquet-cpp/teams","hooks_url":"https://api.github.com/repos/asandryh/parquet-cpp/hooks","issue_events_url":"https://api.github.com/repos/asandryh/parquet-cpp/issues/events{/number}","events_url":"https://api.github.com/repos/asandryh/parquet-cpp/events","assignees_url":"https://api.github.com/repos/asandryh/parquet-cpp/assignees{/user}","branches_url":"https://api.github.com/repos/asandryh/parquet-cpp/branches{/branch}","tags_url":"https://api.github.com/repos/asandryh/parquet-cpp/tags","blobs_url":"https://api.github.com/repos/asandryh/parquet-cpp/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/asandryh/parquet-cpp/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/asandryh/parquet-cpp/git/refs{/sha}","trees_url":"https://api.github.com/repos/asandryh/parquet-cpp/git/trees{/sha}","statuses_url":"https://api.github.com/repos/asandryh/parquet-cpp/statuses/{sha}","languages_url":"https://api.github.com/repos/asandryh/parquet-cpp/languages","stargazers_url":"https://api.github.com/repos/asandryh/parquet-cpp/stargazers","contributors_url":"https://api.github.com/repos/asandryh/parquet-cpp/contributors","subscribers_url":"https://api.github.com/repos/asandryh/parquet-cpp/subscribers","subscription_url":"https://api.github.com/repos/asandryh/parquet-cpp/subscription","commits_url":"https://api.github.com/repos/asandryh/parquet-cpp/commits{/sha}","git_commits_url":"https://api.github.com/repos/asandryh/parquet-cpp/git/commits{/sha}","comments_url":"https://api.github.com/repos/asandryh/parquet-cpp/comments{/number}","issue_comment_url":"https://api.github.com/repos/asandryh/parquet-cpp/issues/comments{/number}","contents_url":"https://api.github.com/repos/asandryh/parquet-cpp/contents/{+path}","compare_url":"https://api.github.com/repos/asandryh/parquet-cpp/compare/{base}...{head}","merges_url":"https://api.github.com/repos/asandryh/parquet-cpp/merges","archive_url":"https://api.github.com/repos/asandryh/parquet-cpp/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/asandryh/parquet-cpp/downloads","issues_url":"https://api.github.com/repos/asandryh/parquet-cpp/issues{/number}","pulls_url":"https://api.github.com/repos/asandryh/parquet-cpp/pulls{/number}","milestones_url":"https://api.github.com/repos/asandryh/parquet-cpp/milestones{/number}","notifications_url":"https://api.github.com/repos/asandryh/parquet-cpp/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/asandryh/parquet-cpp/labels{/name}","releases_url":"https://api.github.com/repos/asandryh/parquet-cpp/releases{/id}","deployments_url":"https://api.github.com/repos/asandryh/parquet-cpp/deployments","created_at":"2016-01-13T17:19:55Z","updated_at":"2016-01-13T17:19:57Z","pushed_at":"2016-02-19T22:54:14Z","git_url":"git://github.com/asandryh/parquet-cpp.git","ssh_url":"git@github.com:asandryh/parquet-cpp.git","clone_url":"https://github.com/asandryh/parquet-cpp.git","svn_url":"https://github.com/asandryh/parquet-cpp","homepage":null,"size":539,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"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":"9cab887f2337ae6205cbd7ea908bcb749c5c9343","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-02-19T20:31:11Z","pushed_at":"2016-02-19T22:54:15Z","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":765,"stargazers_count":29,"watchers_count":29,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":21,"mirror_url":"git://git.apache.org/parquet-cpp.git","open_issues_count":4,"forks":21,"open_issues":4,"watchers":29,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/parquet-cpp/pulls/50"},"html":{"href":"https://github.com/apache/parquet-cpp/pull/50"},"issue":{"href":"https://api.github.com/repos/apache/parquet-cpp/issues/50"},"comments":{"href":"https://api.github.com/repos/apache/parquet-cpp/issues/50/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/parquet-cpp/pulls/50/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/50/commits"},"statuses":{"href":"https://api.github.com/repos/apache/parquet-cpp/statuses/261e21f2246e082c5933382662351aa7ff1b5f1b"}}}}