Search in sources :

Example 1 with CodedInputStream

use of io.trino.orc.protobuf.CodedInputStream in project trino by trinodb.

the class TestOrcBloomFilters method testOrcHiveBloomFilterSerde.

@Test
public void testOrcHiveBloomFilterSerde() throws Exception {
    BloomFilter bloomFilterWrite = new BloomFilter(1000L, 0.05);
    bloomFilterWrite.add(TEST_STRING);
    assertTrue(bloomFilterWrite.test(TEST_STRING));
    assertTrue(bloomFilterWrite.testSlice(wrappedBuffer(TEST_STRING)));
    Slice bloomFilterBytes = new CompressedMetadataWriter(new OrcMetadataWriter(WriterIdentification.TRINO), CompressionKind.NONE, 1024).writeBloomFilters(ImmutableList.of(bloomFilterWrite));
    // Read through method
    InputStream inputStream = bloomFilterBytes.getInput();
    OrcMetadataReader metadataReader = new OrcMetadataReader();
    List<BloomFilter> bloomFilters = metadataReader.readBloomFilterIndexes(inputStream);
    assertEquals(bloomFilters.size(), 1);
    assertTrue(bloomFilters.get(0).test(TEST_STRING));
    assertTrue(bloomFilters.get(0).testSlice(wrappedBuffer(TEST_STRING)));
    assertFalse(bloomFilters.get(0).test(TEST_STRING_NOT_WRITTEN));
    assertFalse(bloomFilters.get(0).testSlice(wrappedBuffer(TEST_STRING_NOT_WRITTEN)));
    assertEquals(bloomFilterWrite.getNumBits(), bloomFilters.get(0).getNumBits());
    assertEquals(bloomFilterWrite.getNumHashFunctions(), bloomFilters.get(0).getNumHashFunctions());
    // Validate bit set
    assertTrue(Arrays.equals(bloomFilters.get(0).getBitSet(), bloomFilterWrite.getBitSet()));
    // Read directly: allows better inspection of the bit sets (helped to fix a lot of bugs)
    CodedInputStream input = CodedInputStream.newInstance(bloomFilterBytes.getBytes());
    OrcProto.BloomFilterIndex deserializedBloomFilterIndex = OrcProto.BloomFilterIndex.parseFrom(input);
    List<OrcProto.BloomFilter> bloomFilterList = deserializedBloomFilterIndex.getBloomFilterList();
    assertEquals(bloomFilterList.size(), 1);
    OrcProto.BloomFilter bloomFilterRead = bloomFilterList.get(0);
    // Validate contents of ORC bloom filter bit set
    assertTrue(Arrays.equals(Longs.toArray(bloomFilterRead.getBitsetList()), bloomFilterWrite.getBitSet()));
    // hash functions
    assertEquals(bloomFilterWrite.getNumHashFunctions(), bloomFilterRead.getNumHashFunctions());
    // bit size
    assertEquals(bloomFilterWrite.getBitSet().length, bloomFilterRead.getBitsetCount());
}
Also used : CompressedMetadataWriter(io.trino.orc.metadata.CompressedMetadataWriter) Slice(io.airlift.slice.Slice) CodedInputStream(io.trino.orc.protobuf.CodedInputStream) InputStream(java.io.InputStream) CodedInputStream(io.trino.orc.protobuf.CodedInputStream) OrcMetadataReader(io.trino.orc.metadata.OrcMetadataReader) OrcProto(io.trino.orc.proto.OrcProto) OrcMetadataWriter(io.trino.orc.metadata.OrcMetadataWriter) BloomFilter(io.trino.orc.metadata.statistics.BloomFilter) TupleDomainOrcPredicate.checkInBloomFilter(io.trino.orc.TupleDomainOrcPredicate.checkInBloomFilter) Test(org.testng.annotations.Test)

Example 2 with CodedInputStream

use of io.trino.orc.protobuf.CodedInputStream in project trino by trinodb.

the class OrcMetadataReader method readBloomFilterIndexes.

@Override
public List<BloomFilter> readBloomFilterIndexes(InputStream inputStream) throws IOException {
    CodedInputStream input = CodedInputStream.newInstance(inputStream);
    OrcProto.BloomFilterIndex bloomFilter = OrcProto.BloomFilterIndex.parseFrom(input);
    List<OrcProto.BloomFilter> bloomFilterList = bloomFilter.getBloomFilterList();
    ImmutableList.Builder<BloomFilter> builder = ImmutableList.builder();
    for (OrcProto.BloomFilter orcBloomFilter : bloomFilterList) {
        if (orcBloomFilter.hasUtf8Bitset()) {
            ByteString utf8Bitset = orcBloomFilter.getUtf8Bitset();
            long[] bits = new long[utf8Bitset.size() / 8];
            utf8Bitset.asReadOnlyByteBuffer().order(ByteOrder.LITTLE_ENDIAN).asLongBuffer().get(bits);
            builder.add(new BloomFilter(bits, orcBloomFilter.getNumHashFunctions()));
        } else {
            builder.add(new BloomFilter(Longs.toArray(orcBloomFilter.getBitsetList()), orcBloomFilter.getNumHashFunctions()));
        }
    }
    return builder.build();
}
Also used : CodedInputStream(io.trino.orc.protobuf.CodedInputStream) ImmutableList.toImmutableList(com.google.common.collect.ImmutableList.toImmutableList) ImmutableList(com.google.common.collect.ImmutableList) ByteString(io.trino.orc.protobuf.ByteString) OrcProto(io.trino.orc.proto.OrcProto) BloomFilter(io.trino.orc.metadata.statistics.BloomFilter)

Example 3 with CodedInputStream

use of io.trino.orc.protobuf.CodedInputStream in project trino by trinodb.

the class OrcMetadataReader method readPostScript.

@Override
public PostScript readPostScript(InputStream inputStream) throws IOException {
    CodedInputStream input = CodedInputStream.newInstance(inputStream);
    OrcProto.PostScript postScript = OrcProto.PostScript.parseFrom(input);
    return new PostScript(postScript.getVersionList(), postScript.getFooterLength(), postScript.getMetadataLength(), toCompression(postScript.getCompression()), postScript.getCompressionBlockSize(), toHiveWriterVersion(postScript.getWriterVersion()));
}
Also used : CodedInputStream(io.trino.orc.protobuf.CodedInputStream) OrcProto(io.trino.orc.proto.OrcProto)

Example 4 with CodedInputStream

use of io.trino.orc.protobuf.CodedInputStream in project trino by trinodb.

the class OrcMetadataReader method readMetadata.

@Override
public Metadata readMetadata(HiveWriterVersion hiveWriterVersion, InputStream inputStream) throws IOException {
    CodedInputStream input = CodedInputStream.newInstance(inputStream);
    input.setSizeLimit(PROTOBUF_MESSAGE_MAX_LIMIT);
    OrcProto.Metadata metadata = OrcProto.Metadata.parseFrom(input);
    return new Metadata(toStripeStatistics(hiveWriterVersion, metadata.getStripeStatsList()));
}
Also used : CodedInputStream(io.trino.orc.protobuf.CodedInputStream) OrcProto(io.trino.orc.proto.OrcProto)

Example 5 with CodedInputStream

use of io.trino.orc.protobuf.CodedInputStream in project trino by trinodb.

the class OrcMetadataReader method readStripeFooter.

@Override
public StripeFooter readStripeFooter(ColumnMetadata<OrcType> types, InputStream inputStream, ZoneId legacyFileTimeZone) throws IOException {
    CodedInputStream input = CodedInputStream.newInstance(inputStream);
    OrcProto.StripeFooter stripeFooter = OrcProto.StripeFooter.parseFrom(input);
    return new StripeFooter(toStream(stripeFooter.getStreamsList()), toColumnEncoding(stripeFooter.getColumnsList()), Optional.ofNullable(emptyToNull(stripeFooter.getWriterTimezone())).map(ZoneId::of).orElse(legacyFileTimeZone));
}
Also used : ZoneId(java.time.ZoneId) CodedInputStream(io.trino.orc.protobuf.CodedInputStream) OrcProto(io.trino.orc.proto.OrcProto)

Aggregations

OrcProto (io.trino.orc.proto.OrcProto)7 CodedInputStream (io.trino.orc.protobuf.CodedInputStream)7 BloomFilter (io.trino.orc.metadata.statistics.BloomFilter)3 ImmutableList (com.google.common.collect.ImmutableList)2 ImmutableList.toImmutableList (com.google.common.collect.ImmutableList.toImmutableList)2 Slice (io.airlift.slice.Slice)2 ZoneId (java.time.ZoneId)2 VisibleForTesting (com.google.common.annotations.VisibleForTesting)1 Preconditions.checkArgument (com.google.common.base.Preconditions.checkArgument)1 Strings.emptyToNull (com.google.common.base.Strings.emptyToNull)1 ImmutableMap (com.google.common.collect.ImmutableMap)1 Longs (com.google.common.primitives.Longs)1 SliceUtf8.lengthOfCodePoint (io.airlift.slice.SliceUtf8.lengthOfCodePoint)1 SliceUtf8.tryGetCodePointAt (io.airlift.slice.SliceUtf8.tryGetCodePointAt)1 Slices (io.airlift.slice.Slices)1 DataSize (io.airlift.units.DataSize)1 GIGABYTE (io.airlift.units.DataSize.Unit.GIGABYTE)1 TupleDomainOrcPredicate.checkInBloomFilter (io.trino.orc.TupleDomainOrcPredicate.checkInBloomFilter)1 ColumnEncodingKind (io.trino.orc.metadata.ColumnEncoding.ColumnEncodingKind)1 CompressedMetadataWriter (io.trino.orc.metadata.CompressedMetadataWriter)1