{"action":"created","comment":{"url":"https://api.github.com/repos/prestodb/presto/pulls/comments/77888935","id":77888935,"diff_hunk":"@@ -0,0 +1,333 @@\n+/*\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * 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, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+package com.facebook.presto.orc;\n+\n+import com.facebook.presto.hive.protobuf.CodedInputStream;\n+import com.facebook.presto.orc.metadata.ColumnStatistics;\n+import com.facebook.presto.orc.metadata.HiveBloomFilter;\n+import com.facebook.presto.orc.metadata.IntegerStatistics;\n+import com.facebook.presto.orc.metadata.OrcMetadataReader;\n+import com.facebook.presto.spi.block.Block;\n+import com.facebook.presto.spi.block.BlockBuilder;\n+import com.facebook.presto.spi.block.BlockBuilderStatus;\n+import com.facebook.presto.spi.predicate.Domain;\n+import com.facebook.presto.spi.predicate.TupleDomain;\n+import com.facebook.presto.spi.type.Type;\n+import com.google.common.collect.ImmutableList;\n+import com.google.common.collect.ImmutableMap;\n+import com.google.common.primitives.Longs;\n+import io.airlift.slice.Slice;\n+import org.apache.hadoop.hive.ql.io.orc.OrcProto;\n+import org.apache.hive.common.util.BloomFilter;\n+import org.testng.annotations.Test;\n+\n+import java.io.ByteArrayInputStream;\n+import java.io.ByteArrayOutputStream;\n+import java.io.IOException;\n+import java.io.InputStream;\n+import java.math.BigDecimal;\n+import java.sql.Timestamp;\n+import java.util.Collection;\n+import java.util.Date;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.Optional;\n+\n+import static com.facebook.presto.spi.type.BigintType.BIGINT;\n+import static com.facebook.presto.spi.type.BooleanType.BOOLEAN;\n+import static com.facebook.presto.spi.type.DoubleType.DOUBLE;\n+import static com.facebook.presto.spi.type.IntegerType.INTEGER;\n+import static com.facebook.presto.spi.type.TimestampType.TIMESTAMP;\n+import static com.facebook.presto.spi.type.VarcharType.VARCHAR;\n+import static org.testng.Assert.assertEquals;\n+import static org.testng.Assert.assertFalse;\n+import static org.testng.Assert.assertTrue;\n+import static org.testng.Assert.fail;\n+\n+public class TestOrcBloomFilters\n+{\n+    private static final String TEST_STRING = \"ORC_STRING\";\n+    private static final String TEST_STRING_NOT_WRITTEN = \"ORC_STRINGnot\";\n+    private static final int TEST_INTEGER = 12345;\n+\n+    @Test\n+    public void testHiveBloomFilterSerde()\n+            throws Exception\n+    {\n+        BloomFilter bloomFilter = new BloomFilter(1_000_000L, 0.05D);\n+\n+        // String\n+        bloomFilter.addString(TEST_STRING);\n+        assertTrue(bloomFilter.testString(TEST_STRING));\n+        assertFalse(bloomFilter.testString(TEST_STRING_NOT_WRITTEN));\n+\n+        // Integer\n+        bloomFilter.addLong(TEST_INTEGER);\n+        assertTrue(bloomFilter.testLong(TEST_INTEGER));\n+        assertFalse(bloomFilter.testLong(TEST_INTEGER + 1));\n+\n+        // Re-construct\n+        HiveBloomFilter hiveBloomFilter = new HiveBloomFilter(ImmutableList.copyOf(Longs.asList(bloomFilter.getBitSet())), bloomFilter.getBitSize(), bloomFilter.getNumHashFunctions());\n+\n+        // String\n+        assertTrue(hiveBloomFilter.testString(TEST_STRING));\n+        assertFalse(hiveBloomFilter.testString(TEST_STRING_NOT_WRITTEN));\n+\n+        // Integer\n+        assertTrue(hiveBloomFilter.testLong(TEST_INTEGER));\n+        assertFalse(hiveBloomFilter.testLong(TEST_INTEGER + 1));\n+    }\n+\n+    public void compareBitset(long[] a, long[] b)\n+    {\n+        int i = 0;\n+        for (long l : a) {\n+            assertEquals(l, b[i]);\n+            i++;\n+        }\n+    }\n+\n+    public byte[] serializeBloomFilterToIndex(OrcProto.BloomFilter bloomFilter, OrcProto.BloomFilterIndex bloomFilterIndex)\n+            throws IOException\n+    {\n+        assertTrue(bloomFilter.isInitialized());\n+\n+        OrcProto.BloomFilterIndex.Builder builder = bloomFilterIndex.toBuilder();\n+        builder.addBloomFilter(bloomFilter);\n+\n+        OrcProto.BloomFilterIndex index = builder.build();\n+        assertTrue(index.isInitialized());\n+        assertEquals(index.getBloomFilterCount(), 1);\n+\n+        ByteArrayOutputStream os = new ByteArrayOutputStream();\n+        index.writeTo(os);\n+        os.flush();\n+        return os.toByteArray();\n+    }\n+\n+    @Test\n+    public void testOrcHiveBloomFilterSerde()\n+            throws Exception\n+    {\n+        BloomFilter bloomFilterWrite = new BloomFilter(1000L, 0.05D);\n+\n+        bloomFilterWrite.addString(TEST_STRING);\n+        assertTrue(bloomFilterWrite.testString(TEST_STRING));\n+\n+        OrcProto.BloomFilter.Builder bloomFilterBuilder = OrcProto.BloomFilter.newBuilder();\n+        for (long l : bloomFilterWrite.getBitSet()) {\n+            bloomFilterBuilder.addBitset(l);\n+        }\n+        bloomFilterBuilder.setNumHashFunctions(bloomFilterWrite.getNumHashFunctions());\n+\n+        OrcProto.BloomFilter bloomFilter = bloomFilterBuilder.build();\n+        OrcProto.BloomFilterIndex bloomFilterIndex = OrcProto.BloomFilterIndex.getDefaultInstance();\n+        byte[] bytes = serializeBloomFilterToIndex(bloomFilter, bloomFilterIndex);\n+\n+        // Read through method\n+        InputStream inputStream = new ByteArrayInputStream(bytes);\n+        OrcMetadataReader metadataReader = new OrcMetadataReader();\n+        List<HiveBloomFilter> bloomFilters = metadataReader.readBloomFilterIndexes(inputStream);\n+\n+        assertEquals(bloomFilters.size(), 1);\n+\n+        assertTrue(bloomFilters.get(0).testString(TEST_STRING));\n+        assertFalse(bloomFilters.get(0).testString(TEST_STRING_NOT_WRITTEN));\n+\n+        assertEquals(bloomFilterWrite.getBitSize(), bloomFilters.get(0).getBitSize());\n+        assertEquals(bloomFilterWrite.getNumHashFunctions(), bloomFilters.get(0).getNumHashFunctions());\n+\n+        // Validate bitset\n+        compareBitset(bloomFilters.get(0).getBitSet(), bloomFilterWrite.getBitSet());\n+\n+        // Read directly: allows better inspection of the bitsets (helped to fix a lot of bugs)\n+        CodedInputStream input = CodedInputStream.newInstance(bytes);\n+        OrcProto.BloomFilterIndex deserializedBloomFilterIndex = OrcProto.BloomFilterIndex.parseFrom(input);\n+        List<OrcProto.BloomFilter> bloomFilterList = deserializedBloomFilterIndex.getBloomFilterList();\n+        assertEquals(bloomFilterList.size(), 1);\n+\n+        OrcProto.BloomFilter bloomFilterRead = bloomFilterList.get(0);\n+\n+        // Validate contents of ORC bloom filter bitset\n+        compareBitset(Longs.toArray(bloomFilterRead.getBitsetList()), bloomFilterWrite.getBitSet());\n+\n+        // hash functions\n+        assertEquals(bloomFilterWrite.getNumHashFunctions(), bloomFilterRead.getNumHashFunctions());\n+\n+        // bit size\n+        assertEquals(bloomFilterWrite.getBitSet().length, bloomFilterRead.getBitsetCount());\n+    }\n+\n+    private static OrcProto.BloomFilter toOrcBloomFilter(BloomFilter bloomFilter)\n+    {\n+        OrcProto.BloomFilter.Builder builder = OrcProto.BloomFilter.newBuilder();\n+        for (long bits : bloomFilter.getBitSet()) {\n+            builder.addBitset(bits);\n+        }\n+        builder.setNumHashFunctions(bloomFilter.getNumHashFunctions());\n+        return builder.build();\n+    }\n+\n+    @Test\n+    public void testBloomFilterPredicateValuesExisting()\n+            throws Exception\n+    {\n+        ImmutableMap<Object, Type> writeValues = getTestElements();\n+\n+        BloomFilter bloomFilter = new BloomFilter(writeValues.size() * 10, 0.01D);\n+\n+        for (Object o : writeValues.keySet()) {\n+            if (o instanceof Long) {\n+                bloomFilter.addLong((Long) o);\n+            }\n+            else if (o instanceof Integer) {\n+                bloomFilter.addLong((Integer) o);\n+            }\n+            else if (o instanceof String) {\n+                bloomFilter.addString((String) o);\n+            }\n+            else if (o instanceof BigDecimal) {\n+                bloomFilter.addString(o.toString());\n+            }\n+            else if (o instanceof Slice) {\n+                bloomFilter.addString(((Slice) o).toStringUtf8());\n+            }\n+            else if (o instanceof Timestamp) {\n+                bloomFilter.addLong(((Timestamp) o).getTime());\n+            }\n+            else if (o instanceof Double) {\n+                bloomFilter.addDouble((Double) o);\n+            }\n+            else {\n+                fail(\"Unsuppored type \" + o.getClass());\n+            }\n+        }\n+\n+        for (Map.Entry<Object, Type> testValue : writeValues.entrySet()) {\n+            boolean matched = TupleDomainOrcPredicate.checkInBloomFilter(bloomFilter, testValue.getKey(), testValue.getValue());\n+            assertTrue(matched, \"type \" + testValue.getClass());\n+        }\n+\n+        // test unsupported type\n+        assertTrue(TupleDomainOrcPredicate.checkInBloomFilter(bloomFilter, new Date(), TIMESTAMP), \"unsupported type Date should always return true\");\n+    }\n+\n+    public ImmutableMap<Object, Type> getTestElements()\n+    {\n+        ImmutableMap.Builder<Object, Type> writeBuilder = ImmutableMap.builder();\n+        writeBuilder.put(TEST_STRING, VARCHAR);\n+        writeBuilder.put(4312L, BIGINT);\n+        writeBuilder.put(123, INTEGER);\n+        writeBuilder.put(234D, DOUBLE);\n+        return writeBuilder.build();\n+    }\n+\n+    @Test\n+    public void testBloomFilterPredicateValuesNonExisting()\n+            throws Exception\n+    {\n+        ImmutableMap<Object, Type> testValues = getTestElements();\n+\n+        BloomFilter bloomFilter = new BloomFilter(testValues.size() * 10, 0.01D);\n+\n+        for (Map.Entry<Object, Type> testValue : testValues.entrySet()) {\n+            boolean matched = TupleDomainOrcPredicate.checkInBloomFilter(bloomFilter, testValue.getKey(), testValue.getValue());\n+            assertFalse(matched, \"type \" + testValue.getKey().getClass());\n+        }\n+\n+        // test unsupported type\n+        assertTrue(TupleDomainOrcPredicate.checkInBloomFilter(bloomFilter, new Date(), null), \"unsupported type Date should always return true\");\n+    }\n+\n+    @Test\n+    public void testExtractValuesFromSingleDomain()\n+            throws Exception\n+    {\n+        ImmutableMap.Builder<Type, Object> testBuilder = ImmutableMap.builder();\n+        testBuilder.put(BOOLEAN, true);\n+        testBuilder.put(INTEGER, 1234L); // internally treated as long\n+        testBuilder.put(BIGINT, 4321L);\n+        testBuilder.put(DOUBLE, 0.123D);\n+        BlockBuilder blockBuilder = VARCHAR.createBlockBuilder(new BlockBuilderStatus(), 15);\n+        VARCHAR.writeString(blockBuilder, TEST_STRING);\n+        Block block = blockBuilder.build();\n+        testBuilder.put(VARCHAR, VARCHAR.getSlice(block, 0));\n+        ImmutableMap<Type, Object> testValues = testBuilder.build();\n+\n+        for (Map.Entry<Type, Object> testValue : testValues.entrySet()) {\n+            Domain predicateDomain = Domain.singleValue(testValue.getKey(), testValue.getValue());\n+            Collection<Object> objects = TupleDomainOrcPredicate.predicateValuesFromDomain(predicateDomain);\n+            assertEquals(objects.size(), 1);\n+            assertEquals(objects.iterator().next(), testValue.getValue());\n+        }\n+    }\n+\n+    @Test\n+    // simulate query on a 2 columns where 1 is used as part of the where, with and without bloom filter\n+    public void testMatches()\n+            throws Exception\n+    {\n+        // stripe columns\n+        TestingColumnHandle testingColumnHandle = new TestingColumnHandle(\"bigint_0\");","path":"presto-orc/src/test/java/com/facebook/presto/orc/TestOrcBloomFilters.java","position":282,"original_position":282,"commit_id":"ae8dfe2f319a809d5290af565a7a58368c459ffa","original_commit_id":"ae8dfe2f319a809d5290af565a7a58368c459ffa","user":{"login":"dain","id":58298,"avatar_url":"https://avatars.githubusercontent.com/u/58298?v=3","gravatar_id":"","url":"https://api.github.com/users/dain","html_url":"https://github.com/dain","followers_url":"https://api.github.com/users/dain/followers","following_url":"https://api.github.com/users/dain/following{/other_user}","gists_url":"https://api.github.com/users/dain/gists{/gist_id}","starred_url":"https://api.github.com/users/dain/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dain/subscriptions","organizations_url":"https://api.github.com/users/dain/orgs","repos_url":"https://api.github.com/users/dain/repos","events_url":"https://api.github.com/users/dain/events{/privacy}","received_events_url":"https://api.github.com/users/dain/received_events","type":"User","site_admin":false},"body":"As I commented below, you don't need `TestingColumnHandle` and instead can just imply use a `String`.  In this case I would define the following constants:\r\n```java\r\n    private static final String COLUMN_0 = \"bigint_0\";\r\n    private static final String COLUMN_1 = \"bigint_1\";\r\n","created_at":"2016-09-07T19:35:23Z","updated_at":"2016-09-07T19:35:23Z","html_url":"https://github.com/prestodb/presto/pull/5998#discussion_r77888935","pull_request_url":"https://api.github.com/repos/prestodb/presto/pulls/5998","_links":{"self":{"href":"https://api.github.com/repos/prestodb/presto/pulls/comments/77888935"},"html":{"href":"https://github.com/prestodb/presto/pull/5998#discussion_r77888935"},"pull_request":{"href":"https://api.github.com/repos/prestodb/presto/pulls/5998"}}},"pull_request":{"url":"https://api.github.com/repos/prestodb/presto/pulls/5998","id":83477896,"html_url":"https://github.com/prestodb/presto/pull/5998","diff_url":"https://github.com/prestodb/presto/pull/5998.diff","patch_url":"https://github.com/prestodb/presto/pull/5998.patch","issue_url":"https://api.github.com/repos/prestodb/presto/issues/5998","number":5998,"state":"open","locked":false,"title":"Support skipping reads from ORC bloomfilters","user":{"login":"RobinUS2","id":1712500,"avatar_url":"https://avatars.githubusercontent.com/u/1712500?v=3","gravatar_id":"","url":"https://api.github.com/users/RobinUS2","html_url":"https://github.com/RobinUS2","followers_url":"https://api.github.com/users/RobinUS2/followers","following_url":"https://api.github.com/users/RobinUS2/following{/other_user}","gists_url":"https://api.github.com/users/RobinUS2/gists{/gist_id}","starred_url":"https://api.github.com/users/RobinUS2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RobinUS2/subscriptions","organizations_url":"https://api.github.com/users/RobinUS2/orgs","repos_url":"https://api.github.com/users/RobinUS2/repos","events_url":"https://api.github.com/users/RobinUS2/events{/privacy}","received_events_url":"https://api.github.com/users/RobinUS2/received_events","type":"User","site_admin":false},"body":"This would fix #3071 ","created_at":"2016-08-31T15:43:03Z","updated_at":"2016-09-07T19:35:23Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3cf037874fc817d50d1216373e6bbda28e49d111","assignee":{"login":"dain","id":58298,"avatar_url":"https://avatars.githubusercontent.com/u/58298?v=3","gravatar_id":"","url":"https://api.github.com/users/dain","html_url":"https://github.com/dain","followers_url":"https://api.github.com/users/dain/followers","following_url":"https://api.github.com/users/dain/following{/other_user}","gists_url":"https://api.github.com/users/dain/gists{/gist_id}","starred_url":"https://api.github.com/users/dain/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dain/subscriptions","organizations_url":"https://api.github.com/users/dain/orgs","repos_url":"https://api.github.com/users/dain/repos","events_url":"https://api.github.com/users/dain/events{/privacy}","received_events_url":"https://api.github.com/users/dain/received_events","type":"User","site_admin":false},"assignees":[{"login":"dain","id":58298,"avatar_url":"https://avatars.githubusercontent.com/u/58298?v=3","gravatar_id":"","url":"https://api.github.com/users/dain","html_url":"https://github.com/dain","followers_url":"https://api.github.com/users/dain/followers","following_url":"https://api.github.com/users/dain/following{/other_user}","gists_url":"https://api.github.com/users/dain/gists{/gist_id}","starred_url":"https://api.github.com/users/dain/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dain/subscriptions","organizations_url":"https://api.github.com/users/dain/orgs","repos_url":"https://api.github.com/users/dain/repos","events_url":"https://api.github.com/users/dain/events{/privacy}","received_events_url":"https://api.github.com/users/dain/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/prestodb/presto/pulls/5998/commits","review_comments_url":"https://api.github.com/repos/prestodb/presto/pulls/5998/comments","review_comment_url":"https://api.github.com/repos/prestodb/presto/pulls/comments{/number}","comments_url":"https://api.github.com/repos/prestodb/presto/issues/5998/comments","statuses_url":"https://api.github.com/repos/prestodb/presto/statuses/ae8dfe2f319a809d5290af565a7a58368c459ffa","head":{"label":"RobinUS2:master","ref":"master","sha":"ae8dfe2f319a809d5290af565a7a58368c459ffa","user":{"login":"RobinUS2","id":1712500,"avatar_url":"https://avatars.githubusercontent.com/u/1712500?v=3","gravatar_id":"","url":"https://api.github.com/users/RobinUS2","html_url":"https://github.com/RobinUS2","followers_url":"https://api.github.com/users/RobinUS2/followers","following_url":"https://api.github.com/users/RobinUS2/following{/other_user}","gists_url":"https://api.github.com/users/RobinUS2/gists{/gist_id}","starred_url":"https://api.github.com/users/RobinUS2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RobinUS2/subscriptions","organizations_url":"https://api.github.com/users/RobinUS2/orgs","repos_url":"https://api.github.com/users/RobinUS2/repos","events_url":"https://api.github.com/users/RobinUS2/events{/privacy}","received_events_url":"https://api.github.com/users/RobinUS2/received_events","type":"User","site_admin":false},"repo":{"id":40294338,"name":"presto","full_name":"RobinUS2/presto","owner":{"login":"RobinUS2","id":1712500,"avatar_url":"https://avatars.githubusercontent.com/u/1712500?v=3","gravatar_id":"","url":"https://api.github.com/users/RobinUS2","html_url":"https://github.com/RobinUS2","followers_url":"https://api.github.com/users/RobinUS2/followers","following_url":"https://api.github.com/users/RobinUS2/following{/other_user}","gists_url":"https://api.github.com/users/RobinUS2/gists{/gist_id}","starred_url":"https://api.github.com/users/RobinUS2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/RobinUS2/subscriptions","organizations_url":"https://api.github.com/users/RobinUS2/orgs","repos_url":"https://api.github.com/users/RobinUS2/repos","events_url":"https://api.github.com/users/RobinUS2/events{/privacy}","received_events_url":"https://api.github.com/users/RobinUS2/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/RobinUS2/presto","description":"Distributed SQL query engine for running interactive analytic queries against big data sources.","fork":true,"url":"https://api.github.com/repos/RobinUS2/presto","forks_url":"https://api.github.com/repos/RobinUS2/presto/forks","keys_url":"https://api.github.com/repos/RobinUS2/presto/keys{/key_id}","collaborators_url":"https://api.github.com/repos/RobinUS2/presto/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/RobinUS2/presto/teams","hooks_url":"https://api.github.com/repos/RobinUS2/presto/hooks","issue_events_url":"https://api.github.com/repos/RobinUS2/presto/issues/events{/number}","events_url":"https://api.github.com/repos/RobinUS2/presto/events","assignees_url":"https://api.github.com/repos/RobinUS2/presto/assignees{/user}","branches_url":"https://api.github.com/repos/RobinUS2/presto/branches{/branch}","tags_url":"https://api.github.com/repos/RobinUS2/presto/tags","blobs_url":"https://api.github.com/repos/RobinUS2/presto/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/RobinUS2/presto/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/RobinUS2/presto/git/refs{/sha}","trees_url":"https://api.github.com/repos/RobinUS2/presto/git/trees{/sha}","statuses_url":"https://api.github.com/repos/RobinUS2/presto/statuses/{sha}","languages_url":"https://api.github.com/repos/RobinUS2/presto/languages","stargazers_url":"https://api.github.com/repos/RobinUS2/presto/stargazers","contributors_url":"https://api.github.com/repos/RobinUS2/presto/contributors","subscribers_url":"https://api.github.com/repos/RobinUS2/presto/subscribers","subscription_url":"https://api.github.com/repos/RobinUS2/presto/subscription","commits_url":"https://api.github.com/repos/RobinUS2/presto/commits{/sha}","git_commits_url":"https://api.github.com/repos/RobinUS2/presto/git/commits{/sha}","comments_url":"https://api.github.com/repos/RobinUS2/presto/comments{/number}","issue_comment_url":"https://api.github.com/repos/RobinUS2/presto/issues/comments{/number}","contents_url":"https://api.github.com/repos/RobinUS2/presto/contents/{+path}","compare_url":"https://api.github.com/repos/RobinUS2/presto/compare/{base}...{head}","merges_url":"https://api.github.com/repos/RobinUS2/presto/merges","archive_url":"https://api.github.com/repos/RobinUS2/presto/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/RobinUS2/presto/downloads","issues_url":"https://api.github.com/repos/RobinUS2/presto/issues{/number}","pulls_url":"https://api.github.com/repos/RobinUS2/presto/pulls{/number}","milestones_url":"https://api.github.com/repos/RobinUS2/presto/milestones{/number}","notifications_url":"https://api.github.com/repos/RobinUS2/presto/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/RobinUS2/presto/labels{/name}","releases_url":"https://api.github.com/repos/RobinUS2/presto/releases{/id}","deployments_url":"https://api.github.com/repos/RobinUS2/presto/deployments","created_at":"2015-08-06T08:42:02Z","updated_at":"2016-03-18T00:24:51Z","pushed_at":"2016-09-07T12:34:50Z","git_url":"git://github.com/RobinUS2/presto.git","ssh_url":"git@github.com:RobinUS2/presto.git","clone_url":"https://github.com/RobinUS2/presto.git","svn_url":"https://github.com/RobinUS2/presto","homepage":"https://prestodb.io","size":62769,"stargazers_count":0,"watchers_count":0,"language":"Java","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":"prestodb:master","ref":"master","sha":"f7089e8343c861583dea33672e7452cd2d238197","user":{"login":"prestodb","id":6882181,"avatar_url":"https://avatars.githubusercontent.com/u/6882181?v=3","gravatar_id":"","url":"https://api.github.com/users/prestodb","html_url":"https://github.com/prestodb","followers_url":"https://api.github.com/users/prestodb/followers","following_url":"https://api.github.com/users/prestodb/following{/other_user}","gists_url":"https://api.github.com/users/prestodb/gists{/gist_id}","starred_url":"https://api.github.com/users/prestodb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prestodb/subscriptions","organizations_url":"https://api.github.com/users/prestodb/orgs","repos_url":"https://api.github.com/users/prestodb/repos","events_url":"https://api.github.com/users/prestodb/events{/privacy}","received_events_url":"https://api.github.com/users/prestodb/received_events","type":"Organization","site_admin":false},"repo":{"id":5349565,"name":"presto","full_name":"prestodb/presto","owner":{"login":"prestodb","id":6882181,"avatar_url":"https://avatars.githubusercontent.com/u/6882181?v=3","gravatar_id":"","url":"https://api.github.com/users/prestodb","html_url":"https://github.com/prestodb","followers_url":"https://api.github.com/users/prestodb/followers","following_url":"https://api.github.com/users/prestodb/following{/other_user}","gists_url":"https://api.github.com/users/prestodb/gists{/gist_id}","starred_url":"https://api.github.com/users/prestodb/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prestodb/subscriptions","organizations_url":"https://api.github.com/users/prestodb/orgs","repos_url":"https://api.github.com/users/prestodb/repos","events_url":"https://api.github.com/users/prestodb/events{/privacy}","received_events_url":"https://api.github.com/users/prestodb/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/prestodb/presto","description":"Distributed SQL query engine for big data","fork":false,"url":"https://api.github.com/repos/prestodb/presto","forks_url":"https://api.github.com/repos/prestodb/presto/forks","keys_url":"https://api.github.com/repos/prestodb/presto/keys{/key_id}","collaborators_url":"https://api.github.com/repos/prestodb/presto/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/prestodb/presto/teams","hooks_url":"https://api.github.com/repos/prestodb/presto/hooks","issue_events_url":"https://api.github.com/repos/prestodb/presto/issues/events{/number}","events_url":"https://api.github.com/repos/prestodb/presto/events","assignees_url":"https://api.github.com/repos/prestodb/presto/assignees{/user}","branches_url":"https://api.github.com/repos/prestodb/presto/branches{/branch}","tags_url":"https://api.github.com/repos/prestodb/presto/tags","blobs_url":"https://api.github.com/repos/prestodb/presto/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/prestodb/presto/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/prestodb/presto/git/refs{/sha}","trees_url":"https://api.github.com/repos/prestodb/presto/git/trees{/sha}","statuses_url":"https://api.github.com/repos/prestodb/presto/statuses/{sha}","languages_url":"https://api.github.com/repos/prestodb/presto/languages","stargazers_url":"https://api.github.com/repos/prestodb/presto/stargazers","contributors_url":"https://api.github.com/repos/prestodb/presto/contributors","subscribers_url":"https://api.github.com/repos/prestodb/presto/subscribers","subscription_url":"https://api.github.com/repos/prestodb/presto/subscription","commits_url":"https://api.github.com/repos/prestodb/presto/commits{/sha}","git_commits_url":"https://api.github.com/repos/prestodb/presto/git/commits{/sha}","comments_url":"https://api.github.com/repos/prestodb/presto/comments{/number}","issue_comment_url":"https://api.github.com/repos/prestodb/presto/issues/comments{/number}","contents_url":"https://api.github.com/repos/prestodb/presto/contents/{+path}","compare_url":"https://api.github.com/repos/prestodb/presto/compare/{base}...{head}","merges_url":"https://api.github.com/repos/prestodb/presto/merges","archive_url":"https://api.github.com/repos/prestodb/presto/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/prestodb/presto/downloads","issues_url":"https://api.github.com/repos/prestodb/presto/issues{/number}","pulls_url":"https://api.github.com/repos/prestodb/presto/pulls{/number}","milestones_url":"https://api.github.com/repos/prestodb/presto/milestones{/number}","notifications_url":"https://api.github.com/repos/prestodb/presto/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/prestodb/presto/labels{/name}","releases_url":"https://api.github.com/repos/prestodb/presto/releases{/id}","deployments_url":"https://api.github.com/repos/prestodb/presto/deployments","created_at":"2012-08-09T01:03:37Z","updated_at":"2016-09-07T14:06:13Z","pushed_at":"2016-09-07T19:17:13Z","git_url":"git://github.com/prestodb/presto.git","ssh_url":"git@github.com:prestodb/presto.git","clone_url":"https://github.com/prestodb/presto.git","svn_url":"https://github.com/prestodb/presto","homepage":"https://prestodb.io","size":162231,"stargazers_count":5090,"watchers_count":5090,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1564,"mirror_url":null,"open_issues_count":653,"forks":1564,"open_issues":653,"watchers":5090,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/prestodb/presto/pulls/5998"},"html":{"href":"https://github.com/prestodb/presto/pull/5998"},"issue":{"href":"https://api.github.com/repos/prestodb/presto/issues/5998"},"comments":{"href":"https://api.github.com/repos/prestodb/presto/issues/5998/comments"},"review_comments":{"href":"https://api.github.com/repos/prestodb/presto/pulls/5998/comments"},"review_comment":{"href":"https://api.github.com/repos/prestodb/presto/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/prestodb/presto/pulls/5998/commits"},"statuses":{"href":"https://api.github.com/repos/prestodb/presto/statuses/ae8dfe2f319a809d5290af565a7a58368c459ffa"}}}}
{"actor":{"display_login":"dain"}}