diff --git a/common/src/main/java/org/apache/comet/vector/CometDictionary.java b/common/src/main/java/org/apache/comet/vector/CometDictionary.java index b213b75d8..cf3beb7ee 100644 --- a/common/src/main/java/org/apache/comet/vector/CometDictionary.java +++ b/common/src/main/java/org/apache/comet/vector/CometDictionary.java @@ -29,22 +29,9 @@ public class CometDictionary implements AutoCloseable { private CometPlainVector values; private final int numValues; - /** Decoded dictionary values. Only one of the following is set. */ - private byte[] bytes; - - private short[] shorts; - private int[] ints; - private long[] longs; - private float[] floats; - private double[] doubles; - private boolean[] booleans; - private ByteArrayWrapper[] binaries; - private UTF8String[] strings; - public CometDictionary(CometPlainVector values) { this.values = values; this.numValues = values.numValues(); - initialize(); } public void setDictionaryVector(CometPlainVector values) { @@ -59,121 +46,57 @@ public ValueVector getValueVector() { } public boolean decodeToBoolean(int index) { - return booleans[index]; + return values.getBoolean(index); } public byte decodeToByte(int index) { - return bytes[index]; + return values.getByte(index); } public short decodeToShort(int index) { - return shorts[index]; + return values.getShort(index); } public int decodeToInt(int index) { - return ints[index]; + return values.getInt(index); } public long decodeToLong(int index) { - return longs[index]; + return values.getLong(index); } public float decodeToFloat(int index) { - return floats[index]; + return values.getFloat(index); } public double decodeToDouble(int index) { - return doubles[index]; + return values.getDouble(index); } public byte[] decodeToBinary(int index) { - return binaries[index].bytes; - } - - public UTF8String decodeToUTF8String(int index) { - return strings[index]; - } - - @Override - public void close() { - values.close(); - } - - private void initialize() { switch (values.getValueVector().getMinorType()) { - case BIT: - booleans = new boolean[numValues]; - for (int i = 0; i < numValues; i++) { - booleans[i] = values.getBoolean(i); - } - break; - case TINYINT: - bytes = new byte[numValues]; - for (int i = 0; i < numValues; i++) { - bytes[i] = values.getByte(i); - } - break; - case SMALLINT: - shorts = new short[numValues]; - for (int i = 0; i < numValues; i++) { - shorts[i] = values.getShort(i); - } - break; - case INT: - case DATEDAY: - ints = new int[numValues]; - for (int i = 0; i < numValues; i++) { - ints[i] = values.getInt(i); - } - break; - case BIGINT: - case TIMESTAMPMICRO: - case TIMESTAMPMICROTZ: - longs = new long[numValues]; - for (int i = 0; i < numValues; i++) { - longs[i] = values.getLong(i); - } - break; - case FLOAT4: - floats = new float[numValues]; - for (int i = 0; i < numValues; i++) { - floats[i] = values.getFloat(i); - } - break; - case FLOAT8: - doubles = new double[numValues]; - for (int i = 0; i < numValues; i++) { - doubles[i] = values.getDouble(i); - } - break; case VARBINARY: case FIXEDSIZEBINARY: - binaries = new ByteArrayWrapper[numValues]; - for (int i = 0; i < numValues; i++) { - binaries[i] = new ByteArrayWrapper(values.getBinary(i)); - } - break; - case VARCHAR: - strings = new UTF8String[numValues]; - for (int i = 0; i < numValues; i++) { - strings[i] = values.getUTF8String(i); - } - break; + return values.getBinary(index); case DECIMAL: - binaries = new ByteArrayWrapper[numValues]; - for (int i = 0; i < numValues; i++) { - // Need copying here since we re-use byte array for decimal - byte[] bytes = new byte[DECIMAL_BYTE_WIDTH]; - bytes = values.copyBinaryDecimal(i, bytes); - binaries[i] = new ByteArrayWrapper(bytes); - } - break; + byte[] bytes = new byte[DECIMAL_BYTE_WIDTH]; + bytes = values.copyBinaryDecimal(index, bytes); + return bytes; default: throw new IllegalArgumentException( "Invalid Arrow minor type: " + values.getValueVector().getMinorType()); } } + public UTF8String decodeToUTF8String(int index) { + return values.getUTF8String(index); + } + + @Override + public void close() { + values.close(); + } + private static class ByteArrayWrapper { private final byte[] bytes;