diff --git a/Util/src/main/java/io/deephaven/util/codec/ObjectDecoder.java b/Util/src/main/java/io/deephaven/util/codec/ObjectDecoder.java index 6e52078c0d4..82ffb379af2 100644 --- a/Util/src/main/java/io/deephaven/util/codec/ObjectDecoder.java +++ b/Util/src/main/java/io/deephaven/util/codec/ObjectDecoder.java @@ -7,6 +7,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.nio.ByteBuffer; + /** *

* Codec superinterface for Object translation from byte arrays for serialization and deserialization. @@ -30,12 +32,30 @@ public interface ObjectDecoder { * * @param input The input byte array containing bytes to decode * @param offset The offset into the byte array to start decoding from - * @param length The length of the byte array to decode from, starting at the offset + * @param length The number of bytes to decode, starting at the offset * @return The output object, possibly null */ @Nullable TYPE decode(@NotNull byte[] input, int offset, int length); + /** + * Decode an object from a ByteBuffer. + * + * @param buffer The input ByteBuffer containing bytes to decode + * @return The output object, possibly null + */ + @Nullable + default TYPE decode(@NotNull final ByteBuffer buffer) { + if (buffer.hasArray()) { + return decode(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.remaining()); + } else { + // Make a copy of the buffer's contents + final byte[] bytes = new byte[buffer.remaining()]; + buffer.get(bytes); + return decode(bytes, 0, bytes.length); + } + } + /** * What width byte array does this ObjectCodec expect to encode and decode? * diff --git a/Util/src/main/java/io/deephaven/util/codec/SimpleByteArrayCodec.java b/Util/src/main/java/io/deephaven/util/codec/SimpleByteArrayCodec.java index e315e851b37..8bf70622a03 100644 --- a/Util/src/main/java/io/deephaven/util/codec/SimpleByteArrayCodec.java +++ b/Util/src/main/java/io/deephaven/util/codec/SimpleByteArrayCodec.java @@ -49,7 +49,9 @@ public byte[] encode(@Nullable final byte[] input) { if (input == null) { throw new IllegalArgumentException(SimpleByteArrayCodec.class.getSimpleName() + " cannot encode nulls"); } - return input; + final byte[] output = new byte[input.length]; + System.arraycopy(input, 0, output, 0, input.length); + return output; } @Override @@ -73,9 +75,6 @@ public byte[] decode(@NotNull final byte[] input, final int offset, final int le if (input.length == 0) { return CollectionUtil.ZERO_LENGTH_BYTE_ARRAY; } - if (offset == 0 && length == input.length) { - return input; - } final byte[] output = new byte[length]; System.arraycopy(input, offset, output, 0, length); return output; diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/ColumnPageReaderImpl.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/ColumnPageReaderImpl.java index 14c60369f01..21ecc5cef7e 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/ColumnPageReaderImpl.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/ColumnPageReaderImpl.java @@ -345,7 +345,7 @@ private IntBuffer readKeysFromPageCommon( final RunLengthBitPackingHybridBufferDecoder rlDecoder, final RunLengthBitPackingHybridBufferDecoder dlDecoder, final ValuesReader dataReader) throws IOException { - final Object result = materialize(IntMaterializer.Factory, dlDecoder, rlDecoder, dataReader, nullPlaceholder); + final Object result = materialize(IntMaterializer.FACTORY, dlDecoder, rlDecoder, dataReader, nullPlaceholder); if (result instanceof DataWithOffsets) { keyDest.put((int[]) ((DataWithOffsets) result).materializeResult); return ((DataWithOffsets) result).offsets; diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/PageMaterializerFactory.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/PageMaterializerFactory.java index a276ca24ff0..1db402b14d4 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/PageMaterializerFactory.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/PageMaterializerFactory.java @@ -9,4 +9,16 @@ public interface PageMaterializerFactory { PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues); PageMaterializer makeMaterializerNonNull(ValuesReader dataReader, int numValues); + + PageMaterializerFactory NULL_FACTORY = new PageMaterializerFactory() { + @Override + public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { + throw new UnsupportedOperationException("Does not support materializing pages"); + } + + @Override + public PageMaterializer makeMaterializerNonNull(ValuesReader dataReader, int numValues) { + throw new UnsupportedOperationException("Does not support materializing pages"); + } + }; } diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BigDecimalFromBytesMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BigDecimalFromBytesMaterializer.java index 5080ea35dd8..754e4b156f8 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BigDecimalFromBytesMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BigDecimalFromBytesMaterializer.java @@ -49,8 +49,7 @@ private BigDecimalFromBytesMaterializer(ValuesReader dataReader, BigDecimal null @Override public void fillValues(int startIndex, int endIndex) { for (int ii = startIndex; ii < endIndex; ii++) { - final byte[] bytes = dataReader.readBytes().getBytes(); - data[ii] = codec.decode(bytes, 0, bytes.length); + data[ii] = codec.decode(dataReader.readBytes().toByteBuffer()); } } } diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BigIntegerMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BigIntegerMaterializer.java index 36589a48a41..944b9a8f965 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BigIntegerMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BigIntegerMaterializer.java @@ -53,8 +53,7 @@ private BigIntegerMaterializer(ValuesReader dataReader, BigInteger nullValue, in @Override public void fillValues(int startIndex, int endIndex) { for (int ii = startIndex; ii < endIndex; ii++) { - final byte[] bytes = dataReader.readBytes().getBytes(); - data[ii] = codec.decode(bytes, 0, bytes.length); + data[ii] = codec.decode(dataReader.readBytes().toByteBuffer()); } } } diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BlobMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BlobMaterializer.java index bfdaf180281..7e21a194398 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BlobMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BlobMaterializer.java @@ -13,7 +13,7 @@ */ public class BlobMaterializer extends ObjectMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new BlobMaterializer(dataReader, (Binary) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BoolMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BoolMaterializer.java index 89871fbf277..6e5b7f56994 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BoolMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/BoolMaterializer.java @@ -11,7 +11,7 @@ public class BoolMaterializer implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new BoolMaterializer(dataReader, (byte) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/ByteMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/ByteMaterializer.java index 66477aed7c5..d110d91e564 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/ByteMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/ByteMaterializer.java @@ -15,7 +15,7 @@ public class ByteMaterializer implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new ByteMaterializer(dataReader, (byte) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/CharMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/CharMaterializer.java index ee752bdecd8..ea3a28b4586 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/CharMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/CharMaterializer.java @@ -11,7 +11,7 @@ public class CharMaterializer implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new CharMaterializer(dataReader, (char) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/DoubleMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/DoubleMaterializer.java index 2e373e20172..f5143679f1f 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/DoubleMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/DoubleMaterializer.java @@ -15,7 +15,7 @@ public class DoubleMaterializer implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new DoubleMaterializer(dataReader, (double) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/FloatMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/FloatMaterializer.java index fff9142984a..4e802b0b73b 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/FloatMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/FloatMaterializer.java @@ -11,7 +11,7 @@ public class FloatMaterializer implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new FloatMaterializer(dataReader, (float) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantFromInt96Materializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantNanosFromInt96Materializer.java similarity index 85% rename from extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantFromInt96Materializer.java rename to extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantNanosFromInt96Materializer.java index 4782303467d..eb5f731cc6e 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantFromInt96Materializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantNanosFromInt96Materializer.java @@ -18,17 +18,17 @@ * {@link PageMaterializer} implementation for {@link Instant Instants} stored as Int96s representing an Impala format * Timestamp (nanoseconds of day and Julian date encoded as 8 bytes and 4 bytes, respectively) */ -public class InstantFromInt96Materializer extends LongMaterializerBase implements PageMaterializer { +public class InstantNanosFromInt96Materializer extends LongMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { - return new InstantFromInt96Materializer(dataReader, (long) nullValue, numValues); + return new InstantNanosFromInt96Materializer(dataReader, (long) nullValue, numValues); } @Override public PageMaterializer makeMaterializerNonNull(ValuesReader dataReader, int numValues) { - return new InstantFromInt96Materializer(dataReader, numValues); + return new InstantNanosFromInt96Materializer(dataReader, numValues); } }; @@ -48,11 +48,11 @@ public PageMaterializer makeMaterializerNonNull(ValuesReader dataReader, int num private final ValuesReader dataReader; - private InstantFromInt96Materializer(ValuesReader dataReader, int numValues) { + private InstantNanosFromInt96Materializer(ValuesReader dataReader, int numValues) { this(dataReader, 0, numValues); } - private InstantFromInt96Materializer(ValuesReader dataReader, long nullValue, int numValues) { + private InstantNanosFromInt96Materializer(ValuesReader dataReader, long nullValue, int numValues) { super(nullValue, numValues); this.dataReader = dataReader; } diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantNanosFromMicrosMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantNanosFromMicrosMaterializer.java index 751bf7ab1b0..97a25b6d6e0 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantNanosFromMicrosMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantNanosFromMicrosMaterializer.java @@ -10,7 +10,7 @@ public class InstantNanosFromMicrosMaterializer extends LongMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new InstantNanosFromMicrosMaterializer(dataReader, (long) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantNanosFromMillisMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantNanosFromMillisMaterializer.java index 9e7907a0f82..ee08531571c 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantNanosFromMillisMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/InstantNanosFromMillisMaterializer.java @@ -14,7 +14,7 @@ public class InstantNanosFromMillisMaterializer extends LongMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new InstantNanosFromMillisMaterializer(dataReader, (long) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/IntMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/IntMaterializer.java index 847ea3a3e18..97f47e23ebe 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/IntMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/IntMaterializer.java @@ -15,7 +15,7 @@ public class IntMaterializer implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new IntMaterializer(dataReader, (int) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateMaterializer.java index 202e54d83cb..5cd7a76c298 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateMaterializer.java @@ -12,7 +12,7 @@ public class LocalDateMaterializer extends ObjectMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new LocalDateMaterializer(dataReader, (LocalDate) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateTimeFromMicrosMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateTimeFromMicrosMaterializer.java index 022586e6a73..e8b37cc889b 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateTimeFromMicrosMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateTimeFromMicrosMaterializer.java @@ -17,7 +17,7 @@ public class LocalDateTimeFromMicrosMaterializer extends ObjectMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new LocalDateTimeFromMicrosMaterializer(dataReader, (LocalDateTime) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateTimeFromMillisMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateTimeFromMillisMaterializer.java index 7f2f5ec1f92..023be3cdd97 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateTimeFromMillisMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateTimeFromMillisMaterializer.java @@ -13,7 +13,7 @@ public class LocalDateTimeFromMillisMaterializer extends ObjectMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new LocalDateTimeFromMillisMaterializer(dataReader, (LocalDateTime) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateTimeFromNanosMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateTimeFromNanosMaterializer.java index ae3f66bd813..9fd20c3b6ec 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateTimeFromNanosMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalDateTimeFromNanosMaterializer.java @@ -17,7 +17,7 @@ public class LocalDateTimeFromNanosMaterializer extends ObjectMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new LocalDateTimeFromNanosMaterializer(dataReader, (LocalDateTime) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalTimeFromMicrosMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalTimeFromMicrosMaterializer.java index b276c808e4c..9067936bf5b 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalTimeFromMicrosMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalTimeFromMicrosMaterializer.java @@ -12,7 +12,7 @@ public class LocalTimeFromMicrosMaterializer extends ObjectMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new LocalTimeFromMicrosMaterializer(dataReader, (LocalTime) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalTimeFromMillisMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalTimeFromMillisMaterializer.java index aed1d7e6308..aaf3aeaed4e 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalTimeFromMillisMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalTimeFromMillisMaterializer.java @@ -16,7 +16,7 @@ public class LocalTimeFromMillisMaterializer extends ObjectMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new LocalTimeFromMillisMaterializer(dataReader, (LocalTime) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalTimeFromNanosMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalTimeFromNanosMaterializer.java index 75e707442c9..28f34528344 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalTimeFromNanosMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LocalTimeFromNanosMaterializer.java @@ -16,7 +16,7 @@ public class LocalTimeFromNanosMaterializer extends ObjectMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new LocalTimeFromNanosMaterializer(dataReader, (LocalTime) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LongFromUnsignedIntMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LongFromUnsignedIntMaterializer.java index add4270f164..297d7ae6cbb 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LongFromUnsignedIntMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LongFromUnsignedIntMaterializer.java @@ -9,7 +9,7 @@ public class LongFromUnsignedIntMaterializer extends LongMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new LongFromUnsignedIntMaterializer(dataReader, (long) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LongMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LongMaterializer.java index 9f57f184ddb..f28bc8cdcc7 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LongMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/LongMaterializer.java @@ -9,7 +9,7 @@ public class LongMaterializer extends LongMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new LongMaterializer(dataReader, (long) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/ObjectMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/ObjectMaterializer.java index fa1ef5efdd1..fe542b83c1b 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/ObjectMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/ObjectMaterializer.java @@ -53,8 +53,7 @@ private ObjectMaterializer(ValuesReader dataReader, TYPE nullValue, int numValue @Override public void fillValues(int startIndex, int endIndex) { for (int ii = startIndex; ii < endIndex; ii++) { - final byte[] bytes = dataReader.readBytes().getBytes(); - data[ii] = codec.decode(bytes, 0, bytes.length); + data[ii] = codec.decode(dataReader.readBytes().toByteBuffer()); } } } diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/ShortMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/ShortMaterializer.java index cff03881692..b3c5eae6d9a 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/ShortMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/ShortMaterializer.java @@ -15,7 +15,7 @@ public class ShortMaterializer implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new ShortMaterializer(dataReader, (short) nullValue, numValues); diff --git a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/StringMaterializer.java b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/StringMaterializer.java index b594aeb351e..b179c5fb5e9 100644 --- a/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/StringMaterializer.java +++ b/extensions/parquet/base/src/main/java/io/deephaven/parquet/base/materializers/StringMaterializer.java @@ -9,7 +9,7 @@ public class StringMaterializer extends ObjectMaterializerBase implements PageMaterializer { - public static final PageMaterializerFactory Factory = new PageMaterializerFactory() { + public static final PageMaterializerFactory FACTORY = new PageMaterializerFactory() { @Override public PageMaterializer makeMaterializerWithNulls(ValuesReader dataReader, Object nullValue, int numValues) { return new StringMaterializer(dataReader, (String) nullValue, numValues); diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetSchemaReader.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetSchemaReader.java index 30203881799..dc99271414b 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetSchemaReader.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/ParquetSchemaReader.java @@ -35,6 +35,7 @@ import org.jetbrains.annotations.NotNull; import java.io.IOException; +import java.math.BigDecimal; import java.math.BigInteger; import java.time.Instant; import java.time.LocalDate; @@ -407,7 +408,7 @@ public Optional> visit( if (decimalLogicalType.getPrecision() == 1 && decimalLogicalType.getScale() == 0) { return Optional.of(BigInteger.class); } - return Optional.of(java.math.BigDecimal.class); + return Optional.of(BigDecimal.class); } @Override diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/location/ParquetColumnLocation.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/location/ParquetColumnLocation.java index a99b28b9a9f..4c6e53c4b7b 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/location/ParquetColumnLocation.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/location/ParquetColumnLocation.java @@ -379,7 +379,7 @@ private static ToPage makeToPage( toPage = ToLongPage.create(pageType); break; case INT96: - toPage = ToInstantPage.create(pageType); + toPage = ToInstantPage.createFromInt96(pageType); break; case DOUBLE: toPage = ToDoublePage.create(pageType); @@ -456,8 +456,7 @@ private static class LogicalTypeVisitor @Override public Optional> visit( final LogicalTypeAnnotation.StringLogicalTypeAnnotation stringLogicalType) { - return Optional - .of(ToStringPage.create(pageType, columnChunkReader.getDictionarySupplier())); + return Optional.of(ToStringPage.create(pageType, columnChunkReader.getDictionarySupplier())); } @Override @@ -465,11 +464,29 @@ private static class LogicalTypeVisitor final LogicalTypeAnnotation.TimestampLogicalTypeAnnotation timestampLogicalType) { if (timestampLogicalType.isAdjustedToUTC()) { // The column will be stored as nanoseconds elapsed since epoch as long values - return Optional.of(ToInstantPage.create(pageType, timestampLogicalType.getUnit())); + switch (timestampLogicalType.getUnit()) { + case MILLIS: + return Optional.of(ToInstantPage.createFromMillis(pageType)); + case MICROS: + return Optional.of(ToInstantPage.createFromMicros(pageType)); + case NANOS: + return Optional.of(ToInstantPage.createFromNanos(pageType)); + default: + throw new IllegalArgumentException("Unsupported unit=" + timestampLogicalType.getUnit()); + } } // The column will be stored as as LocalDateTime // Ref:https://github.com/apache/parquet-format/blob/master/LogicalTypes.md#local-semantics-timestamps-not-normalized-to-utc - return Optional.of(ToLocalDateTimePage.create(pageType, timestampLogicalType.getUnit())); + switch (timestampLogicalType.getUnit()) { + case MILLIS: + return Optional.of(ToLocalDateTimePage.createFromMillis(pageType)); + case MICROS: + return Optional.of(ToLocalDateTimePage.createFromMicros(pageType)); + case NANOS: + return Optional.of(ToLocalDateTimePage.createFromNanos(pageType)); + default: + throw new IllegalArgumentException("Unsupported unit=" + timestampLogicalType.getUnit()); + } } @Override @@ -505,7 +522,16 @@ private static class LogicalTypeVisitor @Override public Optional> visit(final LogicalTypeAnnotation.TimeLogicalTypeAnnotation timeLogicalType) { // isAdjustedToUTC parameter is ignored while reading LocalTime from Parquet files - return Optional.of(ToLocalTimePage.create(pageType, timeLogicalType.getUnit())); + switch (timeLogicalType.getUnit()) { + case MILLIS: + return Optional.of(ToLocalTimePage.createFromMillis(pageType)); + case MICROS: + return Optional.of(ToLocalTimePage.createFromMicros(pageType)); + case NANOS: + return Optional.of(ToLocalTimePage.createFromNanos(pageType)); + default: + throw new IllegalArgumentException("Unsupported unit=" + timeLogicalType.getUnit()); + } } @Override diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBigDecimalPage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBigDecimalPage.java index 6d32dde3d29..07d3f11e999 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBigDecimalPage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBigDecimalPage.java @@ -37,10 +37,7 @@ public static ToPage create( return new ToPageWithDictionary<>( BigDecimal.class, new ChunkDictionary<>( - (dictionary, key) -> { - final byte[] bytes = dictionary.decodeToBinary(key).getBytes(); - return codec.decode(bytes, 0, bytes.length); - }, + (dictionary, key) -> codec.decode(dictionary.decodeToBinary(key).toByteBuffer()), dictionarySupplier), (final Object result) -> (BigDecimal[]) result, new BigDecimalFromBytesMaterializer.Factory(codec)); diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBigIntegerPage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBigIntegerPage.java index 28f59382283..9597eafb5c7 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBigIntegerPage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBigIntegerPage.java @@ -33,10 +33,7 @@ public static ToPage create( return new ToPageWithDictionary<>( BigInteger.class, new ChunkDictionary<>( - (dictionary, key) -> { - final byte[] bytes = dictionary.decodeToBinary(key).getBytes(); - return codec.decode(bytes, 0, bytes.length); - }, + (dictionary, key) -> codec.decode(dictionary.decodeToBinary(key).toByteBuffer()), dictionarySupplier), (final Object result) -> (BigInteger[]) result, new BigIntegerMaterializer.Factory(codec)); diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBooleanAsBytePage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBooleanAsBytePage.java index be8afd0f49a..8be732df7a2 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBooleanAsBytePage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBooleanAsBytePage.java @@ -56,7 +56,7 @@ public final Object nullValue() { @Override public final PageMaterializerFactory getPageMaterializerFactory() { - return BoolMaterializer.Factory; + return BoolMaterializer.FACTORY; } @Override diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBytePage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBytePage.java index e6935c08563..f63d9f2ebcb 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBytePage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToBytePage.java @@ -52,6 +52,6 @@ public final Object nullValue() { @Override @NotNull public final PageMaterializerFactory getPageMaterializerFactory() { - return ByteMaterializer.Factory; + return ByteMaterializer.FACTORY; } } diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToCharPage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToCharPage.java index ebd8c7f4662..3fbccc9eb95 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToCharPage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToCharPage.java @@ -52,6 +52,6 @@ public final Object nullValue() { @Override @NotNull public final PageMaterializerFactory getPageMaterializerFactory() { - return CharMaterializer.Factory; + return CharMaterializer.FACTORY; } } diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToDoublePage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToDoublePage.java index 590d7d5604a..f5f450f4753 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToDoublePage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToDoublePage.java @@ -52,6 +52,6 @@ public final Object nullValue() { @Override @NotNull public final PageMaterializerFactory getPageMaterializerFactory() { - return DoubleMaterializer.Factory; + return DoubleMaterializer.FACTORY; } } diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToFloatPage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToFloatPage.java index 64476919b7c..64ef1bd83ed 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToFloatPage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToFloatPage.java @@ -52,6 +52,6 @@ public final Object nullValue() { @Override @NotNull public final PageMaterializerFactory getPageMaterializerFactory() { - return FloatMaterializer.Factory; + return FloatMaterializer.FACTORY; } } diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToInstantPage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToInstantPage.java index a26390c2c64..ed53a510dc7 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToInstantPage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToInstantPage.java @@ -6,14 +6,13 @@ import io.deephaven.chunk.ChunkType; import io.deephaven.chunk.attributes.Any; import io.deephaven.parquet.base.PageMaterializerFactory; -import io.deephaven.parquet.base.materializers.InstantFromInt96Materializer; +import io.deephaven.parquet.base.materializers.InstantNanosFromInt96Materializer; import io.deephaven.parquet.base.materializers.InstantNanosFromMicrosMaterializer; import io.deephaven.parquet.base.materializers.InstantNanosFromMillisMaterializer; import io.deephaven.parquet.base.materializers.LongMaterializer; import io.deephaven.time.DateTimeUtils; import io.deephaven.vector.ObjectVector; import io.deephaven.vector.ObjectVectorDirect; -import org.apache.parquet.schema.LogicalTypeAnnotation; import org.jetbrains.annotations.NotNull; import java.time.Instant; @@ -22,43 +21,45 @@ public class ToInstantPage implements ToPage { - @SuppressWarnings("unchecked") - public static ToPage create( - final Class nativeType, - final LogicalTypeAnnotation.TimeUnit unit) { - if (nativeType == null || Instant.class.equals(nativeType)) { - switch (unit) { - case MILLIS: - return FROM_MILLIS; - case MICROS: - return FROM_MICROS; - case NANOS: - return FROM_NANOS; - default: - throw new IllegalArgumentException("Unsupported unit=" + unit); - } - } - throw new IllegalArgumentException( - "The native type for an Instant column is " + nativeType.getCanonicalName()); + public static ToPage createFromMillis(final Class nativeType) { + verifyNativeType(nativeType); + // noinspection unchecked + return FROM_MILLIS; } - @SuppressWarnings("unchecked") - public static ToPage create(final Class nativeType) { - if (nativeType == null || Instant.class.equals(nativeType)) { - return FROM_INT96; - } - throw new IllegalArgumentException( - "The native type for an Instant column is " + nativeType.getCanonicalName()); + public static ToPage createFromMicros(final Class nativeType) { + verifyNativeType(nativeType); + // noinspection unchecked + return FROM_MICROS; + } + + public static ToPage createFromNanos(final Class nativeType) { + verifyNativeType(nativeType); + // noinspection unchecked + return FROM_NANOS; + } + + public static ToPage createFromInt96(final Class nativeType) { + verifyNativeType(nativeType); + // noinspection unchecked + return FROM_INT96; } @SuppressWarnings("rawtypes") - private static final ToPage FROM_MILLIS = new ToInstantPage<>(InstantNanosFromMillisMaterializer.Factory); + private static final ToPage FROM_MILLIS = new ToInstantPage<>(InstantNanosFromMillisMaterializer.FACTORY); @SuppressWarnings("rawtypes") - private static final ToPage FROM_MICROS = new ToInstantPage<>(InstantNanosFromMicrosMaterializer.Factory); + private static final ToPage FROM_MICROS = new ToInstantPage<>(InstantNanosFromMicrosMaterializer.FACTORY); @SuppressWarnings("rawtypes") - private static final ToPage FROM_NANOS = new ToInstantPage<>(LongMaterializer.Factory); + private static final ToPage FROM_NANOS = new ToInstantPage<>(LongMaterializer.FACTORY); @SuppressWarnings("rawtypes") - private static final ToPage FROM_INT96 = new ToInstantPage<>(InstantFromInt96Materializer.Factory); + private static final ToPage FROM_INT96 = new ToInstantPage<>(InstantNanosFromInt96Materializer.FACTORY); + + private static void verifyNativeType(final Class nativeType) { + if (nativeType != null && !Instant.class.equals(nativeType)) { + throw new IllegalArgumentException( + "The native type for an Instant column is " + nativeType.getCanonicalName()); + } + } private final PageMaterializerFactory pageMaterializerFactory; diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToIntPage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToIntPage.java index 60a14f4a2bb..3217d95c0f5 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToIntPage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToIntPage.java @@ -48,6 +48,6 @@ public final Object nullValue() { @Override @NotNull public final PageMaterializerFactory getPageMaterializerFactory() { - return IntMaterializer.Factory; + return IntMaterializer.FACTORY; } } diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLocalDatePage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLocalDatePage.java index bac5507de54..96dce0d8bfd 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLocalDatePage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLocalDatePage.java @@ -42,6 +42,6 @@ public final ChunkType getChunkType() { @Override @NotNull public final PageMaterializerFactory getPageMaterializerFactory() { - return LocalDateMaterializer.Factory; + return LocalDateMaterializer.FACTORY; } } diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLocalDateTimePage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLocalDateTimePage.java index dadf20c5685..3e78bb797dd 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLocalDateTimePage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLocalDateTimePage.java @@ -9,40 +9,43 @@ import io.deephaven.parquet.base.materializers.LocalDateTimeFromMillisMaterializer; import io.deephaven.parquet.base.materializers.LocalDateTimeFromMicrosMaterializer; import io.deephaven.parquet.base.materializers.LocalDateTimeFromNanosMaterializer; -import org.apache.parquet.schema.LogicalTypeAnnotation; import org.jetbrains.annotations.NotNull; -import java.time.Instant; import java.time.LocalDateTime; public class ToLocalDateTimePage implements ToPage { - @SuppressWarnings("unchecked") - public static ToPage create( - final Class nativeType, - final LogicalTypeAnnotation.TimeUnit unit) { - if (nativeType == null || LocalDateTime.class.equals(nativeType)) { - switch (unit) { - case MILLIS: - return FROM_MILLIS; - case MICROS: - return FROM_MICROS; - case NANOS: - return FROM_NANOS; - default: - throw new IllegalArgumentException("Unsupported unit=" + unit); - } - } - throw new IllegalArgumentException( - "The native type for a LocalDateTime column is " + nativeType.getCanonicalName()); + public static ToPage createFromMillis(final Class nativeType) { + verifyNativeType(nativeType); + // noinspection unchecked + return FROM_MILLIS; + } + + public static ToPage createFromMicros(final Class nativeType) { + verifyNativeType(nativeType); + // noinspection unchecked + return FROM_MICROS; + } + + public static ToPage createFromNanos(final Class nativeType) { + verifyNativeType(nativeType); + // noinspection unchecked + return FROM_NANOS; } @SuppressWarnings("rawtypes") - private static final ToPage FROM_MILLIS = new ToLocalDateTimePage<>(LocalDateTimeFromMillisMaterializer.Factory); + private static final ToPage FROM_MILLIS = new ToLocalDateTimePage<>(LocalDateTimeFromMillisMaterializer.FACTORY); @SuppressWarnings("rawtypes") - private static final ToPage FROM_MICROS = new ToLocalDateTimePage<>(LocalDateTimeFromMicrosMaterializer.Factory); + private static final ToPage FROM_MICROS = new ToLocalDateTimePage<>(LocalDateTimeFromMicrosMaterializer.FACTORY); @SuppressWarnings("rawtypes") - private static final ToPage FROM_NANOS = new ToLocalDateTimePage<>(LocalDateTimeFromNanosMaterializer.Factory); + private static final ToPage FROM_NANOS = new ToLocalDateTimePage<>(LocalDateTimeFromNanosMaterializer.FACTORY); + + private static void verifyNativeType(final Class nativeType) { + if (nativeType != null && !LocalDateTime.class.equals(nativeType)) { + throw new IllegalArgumentException( + "The native type for a LocalDateTime column is " + nativeType.getCanonicalName()); + } + } private final PageMaterializerFactory pageMaterializerFactory; diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLocalTimePage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLocalTimePage.java index 17c191bd89a..265b277ff37 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLocalTimePage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLocalTimePage.java @@ -13,40 +13,43 @@ import io.deephaven.parquet.base.materializers.LocalTimeFromMillisMaterializer; import io.deephaven.parquet.base.materializers.LocalTimeFromMicrosMaterializer; import io.deephaven.parquet.base.materializers.LocalTimeFromNanosMaterializer; -import org.apache.parquet.schema.LogicalTypeAnnotation; import org.jetbrains.annotations.NotNull; -import java.time.Instant; import java.time.LocalTime; public class ToLocalTimePage implements ToPage { - @SuppressWarnings("unchecked") - public static ToPage create( - final Class nativeType, - final LogicalTypeAnnotation.TimeUnit unit) { - if (nativeType == null || LocalTime.class.equals(nativeType)) { - switch (unit) { - case MILLIS: - return FROM_MILLIS; - case MICROS: - return FROM_MICROS; - case NANOS: - return FROM_NANOS; - default: - throw new IllegalArgumentException("Unsupported unit=" + unit); - } - } - throw new IllegalArgumentException( - "The native type for a LocalTime column is " + nativeType.getCanonicalName()); + public static ToPage createFromMillis(final Class nativeType) { + verifyNativeType(nativeType); + // noinspection unchecked + return FROM_MILLIS; + } + + public static ToPage createFromMicros(final Class nativeType) { + verifyNativeType(nativeType); + // noinspection unchecked + return FROM_MICROS; + } + + public static ToPage createFromNanos(final Class nativeType) { + verifyNativeType(nativeType); + // noinspection unchecked + return FROM_NANOS; } @SuppressWarnings("rawtypes") - private static final ToPage FROM_MILLIS = new ToLocalTimePage<>(LocalTimeFromMillisMaterializer.Factory); + private static final ToPage FROM_MILLIS = new ToLocalTimePage<>(LocalTimeFromMillisMaterializer.FACTORY); @SuppressWarnings("rawtypes") - private static final ToPage FROM_MICROS = new ToLocalTimePage<>(LocalTimeFromMicrosMaterializer.Factory); + private static final ToPage FROM_MICROS = new ToLocalTimePage<>(LocalTimeFromMicrosMaterializer.FACTORY); @SuppressWarnings("rawtypes") - private static final ToPage FROM_NANOS = new ToLocalTimePage<>(LocalTimeFromNanosMaterializer.Factory); + private static final ToPage FROM_NANOS = new ToLocalTimePage<>(LocalTimeFromNanosMaterializer.FACTORY); + + private static void verifyNativeType(final Class nativeType) { + if (nativeType != null && !LocalTime.class.equals(nativeType)) { + throw new IllegalArgumentException( + "The native type for a LocalTime column is " + nativeType.getCanonicalName()); + } + } private final PageMaterializerFactory pageMaterializerFactory; diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLongPage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLongPage.java index c8446d96c7a..ca86ced2540 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLongPage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToLongPage.java @@ -27,9 +27,9 @@ public static ToLongPage createFromUnsignedInt(final Cl } @SuppressWarnings("rawtypes") - private static final ToLongPage FROM_LONG = new ToLongPage<>(LongMaterializer.Factory); + private static final ToLongPage FROM_LONG = new ToLongPage<>(LongMaterializer.FACTORY); @SuppressWarnings("rawtypes") - private static final ToLongPage FROM_UNSIGNED_INT = new ToLongPage<>(LongFromUnsignedIntMaterializer.Factory); + private static final ToLongPage FROM_UNSIGNED_INT = new ToLongPage<>(LongFromUnsignedIntMaterializer.FACTORY); private static void verifyNativeType(final Class nativeType) { if (nativeType == null || long.class.equals(nativeType)) { diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToObjectPage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToObjectPage.java index d0afdbf1c50..d03bc420641 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToObjectPage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToObjectPage.java @@ -34,10 +34,7 @@ public static ToPage create( return new ToPageWithDictionary<>( nativeType, new ChunkDictionary<>( - (dictionary, key) -> { - final byte[] bytes = dictionary.decodeToBinary(key).getBytes(); - return codec.decode(bytes, 0, bytes.length); - }, + (dictionary, key) -> codec.decode(dictionary.decodeToBinary(key).toByteBuffer()), dictionarySupplier), (final Object result) -> (T[]) result, new ObjectMaterializer.Factory<>(codec, nativeType)); diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToPageWithDictionary.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToPageWithDictionary.java index e4fc69314ed..895644a7c04 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToPageWithDictionary.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToPageWithDictionary.java @@ -129,8 +129,9 @@ public Object nullValue() { @Override @NotNull public PageMaterializerFactory getPageMaterializerFactory() { - // TODO Check if this is right - return IntMaterializer.Factory; + // This factory should not be used for materializing any pages. + // The factory used for reading dictionary keys is provided inside ColumnPageReader#readKeyValues + return PageMaterializerFactory.NULL_FACTORY; } @Override diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToShortPage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToShortPage.java index 8bead54ee59..ce749f217a4 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToShortPage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToShortPage.java @@ -52,6 +52,6 @@ public final Object nullValue() { @Override @NotNull public final PageMaterializerFactory getPageMaterializerFactory() { - return ShortMaterializer.Factory; + return ShortMaterializer.FACTORY; } } diff --git a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToStringPage.java b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToStringPage.java index 39998ae8493..1884fc83832 100644 --- a/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToStringPage.java +++ b/extensions/parquet/table/src/main/java/io/deephaven/parquet/table/pagestore/topage/ToStringPage.java @@ -51,6 +51,6 @@ public final ChunkType getChunkType() { @Override @NotNull public final PageMaterializerFactory getPageMaterializerFactory() { - return StringMaterializer.Factory; + return StringMaterializer.FACTORY; } }